我有一个案例,我需要匹配这个特定案例中的所有文本
NEAR(<everything inside>)
我想出了这个正则表达式,但近距离搜索必须在双引号内,否则它将不起作用:"(s+)?near(s+)?([^)]*([)""s]*)[^)]*)(s+)?"
以下是一些测试用例的例子:
near((fred, car),3)
near(("john smith", "(adam eve)"),3)
near(("term 1","term 2","term 3","(term 4)"),5)
near((fred, car),3) OR near(("john smith", "(adam eve)"),3) AND near(("term 1","term 2","term 3","(term 4)"),5)
这里的主要问题是near(...)
子字符串是否可以出现在作为关键字参数的字符串中如果我们假设它没有出现在那里,我们可以使用正则表达式
假设"
可以用另一种"
(类似SQL的方式(转义的示例模式:
near((?>[^()"]+|"(?:[^"]|"")*"|(?<c>)(|(?<-c>)))*(?(c)(?!)))
用"
用反斜杠转义:
near((?>[^()"]+|"[^"\]*(?:\(?s:.)[^"\]*)*"|(?<c>)(|(?<-c>)))*(?(c)(?!)))
请参阅regex演示#1和regex演示#2。
详细信息:
near(
-near(
字符串(?>[^()"]+|"(?:[^"]|"")*"|(?<c>)(|(?<-c>)))*
-零次或多次出现[^()"]+
-除(
、)
和"
之外的一个或多个字符|
-或"(?:[^"]|"")*"
-一个"
,然后是零个或多个除"
或""
之外的字符,然后是一个"
字符"[^"\]*(?:\(?s:.)[^"\]*)*"
-"
,除"
和之外的零个或多个字符,然后任何转义字符的零次或多次重复,然后除
"
和之外的零次以上字符,然后是
"
字符|
-或- CCD_ 27-在"组"上推送一个值;c";堆栈和
(
匹配 |
-或- CCD_ 30——从组";c";堆栈和
)
随后匹配
- CCD_ 32-如果组"0";c";堆栈不为空
)