我目前有一个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"等等。
注意"[^"]*"
可以替换为".*?"
。后者的意思是"匹配一个双引号,后面跟着零个或多个字符,懒惰地(?
),后面跟着一个双引号"。惰性(非贪婪)匹配尽可能少地匹配字符。