问题描述
我正在尝试对以下字符串执行正则表达式:
-
"sonoma wildfires"
-
sonoma and (wild* or stratus or kincade)
-
sonoma and (wild or "stratus kincade")
...以便获得以下匹配项:
-
['"sonoma wildfires"']
-
['sonoma','and','(wild* or stratus or kincade)']
-
['sonoma','(wild* or "stratus or kincade")']
我正在使用以下正则表达式:
/\w+\*?|["(][^()"]+[")]/g
前两个字符串正确匹配。
但是使用第三个字符串,我得到了这个匹配项:
['sonoma','(wild* or "','stratus','kincade']
...我想要的是:
['sonoma','(wild* or "stratus or kincade")']
它与第一个内部括号匹配,但也获取了第一个内部引用。我一直在对正则表达式进行正面和负面的微调,但是我很难弄清楚。
/\w+\*?|["(](?<!\()[^()"]+(?!\))[")]/g
解决方法
如果这3种情况是您寻找的唯一刻板印象,可以尝试一下
/(\w+) +(and) +(\(.+\))|(\".+\")/g
它将寻找
- 单词 和(表达式)
- “ 表达式”
在regexr中测试它: https://regexr.com/5adgh
[edit]
对不起,我忘了捕获小组了
,您尝试过的第一个模式\w+\*?|["(][^()"]+[")]
无法提供所需的匹配,因为交替的第二部分首先匹配列出的任何字符["(]
,并且可以匹配(
>
然后下一部分[^()"]+
与一个或多个出现的任何字符匹配,但所列字符除外。匹配项不会到达右括号,因为它不能与否定字符类中出现的第三个示例中的双引号交叉。
您不需要任何环顾,您可以在轮换中添加第三种选择。
\w+\*?|\([^()]+\)|"[^"]+"
说明
-
\w+\*?
匹配1个以上的字符和可选的*
-
|
或 -
\([^()]+\)
使用negated character class 从开括号到右括号之间的匹配
-
|
或 -
"[^"]+"
使用否定的字符类在双引号和双引号之间进行匹配
[
`sonoma wildfires"`,`sonoma and (wild* or stratus or kincade)`,`sonoma and (wild or "stratus kincade")`,].forEach(s => console.log(s.match(/\w+\*?|\([^()]+\)|"[^"]+"/g)));