C# 正则表达式匹配附近的文本(<;匹配术语>;)
我有一个案例,我需要匹配这个特定案例中的所有文本C# 正则表达式匹配附近的文本(<;匹配术语>;),c#,regex,C#,Regex,我有一个案例,我需要匹配这个特定案例中的所有文本 NEAR(<everything inside>) 这里的主要问题是,near(…)子字符串是否会出现在作为关键字参数的字符串中。如果我们假设它没有出现在那里,我们可以使用正则表达式 假设“可以用另一个”转义的示例模式(类似SQL的方式): near\(((?>[^()“]+)*(?:[^“]|”)*“(?)\((?)\)*(?(c)(?!)\) 使用“以反斜杠转义: near\((?>[^()”]+|“[^”\]*(?:\\(?
NEAR(<everything inside>)
这里的主要问题是,
near(…)
子字符串是否会出现在作为关键字参数的字符串中。如果我们假设它没有出现在那里,我们可以使用正则表达式
假设“
可以用另一个”
转义的示例模式(类似SQL的方式):
near\(((?>[^()“]+)*(?:[^“]|”)*“(?)\((?)\)*(?(c)(?!)\)
使用“
以反斜杠转义:
near\((?>[^()”]+|“[^”\]*(?:\\(?s:)[^“\\]*)*”(?)\((?)\)*((c)(?!)\)
请参阅和
详细信息:
-near\(
stringnear(
-零次或多次出现(?>[^()”]+|“(?:[^“]|”)*“|(?)\(|(?)\)*
-一个或多个字符,而不是[^()”]+
,(
和)
“
-或|
-一个“(?:[^”]|”“)*”
”,然后是除“
或“
以外的零个或多个字符,然后是一个”
字符”
-“[^”\]*(?:\(?:)[^”\]*)*”
”和“
之外的零个或多个字符,然后是任何转义字符的零个或多个重复,然后是\
和“
之外的零个或多个字符,然后是\
字符”
-或|
-将值推送到组“c”堆栈上,并匹配(?)\(
)(
-或|
-从组“c”堆栈中弹出一个值,然后匹配(?)\)
)
-如果组“c”堆栈不为空,则匹配失败(?(c)(?!)
\)
regex
来解决此问题吗?如果所有输入数据都具有格式near()
,然后您可以通过使用字符串
函数,如子字符串
和索引
来解决这个问题。对不起,我应该更明确地说明这个问题。
是可选的,真正的搜索字符串将比这个复杂得多。因此,我们的想法是在附近的中查找匹配项
搜索所有“
和()
并用一些特殊字符替换(针对我的特定用例)示例:((保管人:(andrea_ring_000_1_1或andrew_lewis_000_1)数据集:Benjamin文件夹:“其他文档”)(描述:一个EDTID:2个标记:“标记父项1”)((数据集:Benjamin或文档集:(aaa和sdcsadc))标记:“标记父1”和附近((弗雷德,车),3)
问题是当near
表达式不在双引号中时,是否需要使regex
工作?@lliar是的,因为搜索字符串可能包含多个near
,其中有多个双引号或括号。带嵌套括号的语言是不规则的,因此基本regex是一个非常糟糕的工具用于解析。使用或编写能够识别括号和字符串的基本解析器更容易、更易于维护并且(可能)更高效。谢谢,这正是我想要的
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)