【问题标题】:Regex match a substring if that substring is not preceded by a specific string?如果子字符串前面没有特定字符串,则正则表达式匹配子字符串?
【发布时间】:2018-06-12 19:01:13
【问题描述】:

我认为这将是一件常见且容易的事情,但到目前为止,我无法通过谷歌搜索找到答案。

如果子字符串之前没有紧跟特定字符串,我将如何匹配子字符串?

在这种情况下,我想匹配 "(空格后跟引号),但前提是它前面没有 ,(逗号)。我尝试了一些不同的东西。目前(?!,) " 与我所得到的一样接近,但负前瞻似乎没有像我预期的那样工作。

我想要的一些例子:

Laura said "What have you done?"            - 1 match
Laura said, "What have you done?"           - 0 matches (there's a comma)
"Come with me," David said.                 - 0 matches (no space before the ")
Michael said "Throw it!" Jessica replied, "I'd rather not..." Shia shouted "Just do it!"
- 2 matches

这是在记事本++中。我做错了什么?

【问题讨论】:

  • 如果你有a,<2 or 3 spaces>"这样的字符串,这里应该匹配什么吗?
  • @WiktorStribiżew 感谢您修复我的格式,我无法弄清楚如何为我的生活做到这一点。我认为是的,因为双倍或三倍间距是我必须解决的一个单独问题。但是无论哪种方式,我都可以采用当前答案中的任何一个并对其进行修改以满足我的需要。一切都很好;)

标签: regex notepad++


【解决方案1】:

您可以使用双重断言来应用两个条件。

(?<= )(?<!, )"

(?&lt;= ) -> 肯定的后向断言断言要匹配的字符必须以空格字符开头。

(?&lt;!, ) -> 否定的lookbehind 断言要匹配的字符前面不能有,&lt;space&gt; 字符。

" -> 仅当两个条件都满足时才匹配双引号。

(?<=[^,] )"|(?<=^ )"

(?&lt;=[^,] )" -> 肯定的lookbehind 断言双引号前面必须有

  • 任何字符,但不是,[^,]
  • 后跟一个空格字符

请注意,此正则表达式不会匹配前面存在空格字符的双引号,例如 *。为了匹配行首存在的引号,我们必须使用另一个条件,例如

(?&lt;=^ )" 匹配前面的引号,

  • ^ 行首。
  • &lt;space&gt;字符

| OR 运算符对这两个条件进行ORing,可以达到预期的结果。

DEMO

如果您还想匹配前面的空格,请从前瞻断言中删除空格。

(?<!,) "

(?&lt;!,) 断言要匹配的字符前面不会有,

DEMO

【讨论】:

  • 这似乎确实有效(嗯,它只匹配引号而不是包含空格,但对于我的目的而言,这实际上并不重要)。我现在正试图破译这里发生了什么(感谢regex101),但如果你能添加你自己的解释那就太好了:)
  • @Clonkex 如果要包含空格,则从前瞻断言中删除 space(?&lt;!,) "
  • 很棒的答案,有很好的解释!稍后我肯定还会有更多问题。当我正确测试后,我会给你接受的标记:)
【解决方案2】:

这似乎对我有用,在 Notepad++ 中测试过:

[^,]\K "

【讨论】:

  • 是的,这行得通。发生的事情也很明显,所以我是粉丝。我为自己不这么想而感到愚蠢。但是,此方法还捕获紧接在空格之前的字符。即使这对我的特定用例无关紧要,如果可能的话,您能否以一种避免这种情况的方式编辑您的帖子?供将来参考和所有这些:)
  • Err 实际上,看起来 @AvinashRaj 已经处理好了。
  • \K可用于使\K的左侧不匹配,例如[^,]\K "
  • 但是如果`"`在行首则不匹配,如果是(?:^|[^,])\K "
  • 他可能确实值得赞扬,特别是考虑到他在详细解释上付出了多少努力,但是接受的答案应该始终是对 OP 最有用的答案,在这种情况下,你的答案就是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
相关资源
最近更新 更多