我想匹配在均匀匹配的双引号之间的单词和/或

  • 本文关键字:单词 之间 regex
  • 更新时间 :
  • 英文 :


我目前有一个regex,当使用括号来包装组

正则表达式

((?<!()b(and|or)b(?![ws]*[)]))/gi

字符串

合同类型为(exhibitanda)一方名称为(pearl and jam)滞纳金15(sonyorsons)

粗体和/或是我想要匹配的。我不想匹配斜体。以上内容目前正在运行


我正试图使用双引号而不是()来获得上述结果,但未能取得任何进展。

正则表达式

((?<!")b(and|or)b(?![ws]*["]))/gi

字符串

合同类型为"展览和"派对的名字是"珍珠和果酱"或者滞纳金为15美元,当事人名称为"sony Or sons">

我没有得到匹配,这对我来说是有意义的,因为所有的and/or都被引号包围了。我的想法是以某种方式重构我的regex来匹配和/或如果左边出现的引号是奇数或右边出现的引号是偶数,但我没有发现任何指向这是可能的。

任何帮助都将非常感激。当我自己在正则表达式上取得进展时,我会继续发布更新。

您的正则表达式匹配"and"或";or"前提是该单词不在字符串后面的")"的前面,并且中间的字符不包含字符"("(即匹配的"("必须在字符串前面,因此不进行匹配)。这显然不能扩展为双引号(或单引号),因为开始和结束引号是相同的字符。

可以匹配正则表达式

"[^"]*"|b(and|or)b

让我们看看在示例字符串中匹配和捕获了什么。

'type is "exhibit and a" and name is "pearl and jam" or 15 and "sony or sons"'
mmmmmmmmmmmmmmm mmm         mmmmmmmmmmmmmmm mm    mmm mmmmmmmmmmmmmm
ccc                         cc    ccc

匹配的字符串用'm'标记。被捕获的字符串用'c'标记。如您所见,我们只对捕获的字符串感兴趣。我们可以简单地忽略未捕获的匹配。当然,您必须在代码中这样做,但无论您使用哪种语言,它都应该非常简单。

第一个匹配从第一个双引号开始,并扩展到下一个双引号。该匹配没有被捕获。regex引擎的字符串指针现在位于第二个双引号和后面的空格之间。然后,它试图匹配该空间,但失败了。然后它成功匹配捕获"one_answers"等等。

注意"[^"]*"可以替换为".*?"。后者的意思是"匹配一个双引号,后面跟着零个或多个字符,懒惰地(?),后面跟着一个双引号"。惰性(非贪婪)匹配尽可能少地匹配字符

演示

最新更新