我正在研究从别人那里继承的一些代码并试图理解C#中的一些正则表达式代码:
Regex.Replace(query, @"""[^""~]+""([^~]|$)",
m => string.Format(field + "_exact:{0}", m.Value))
上面的正则表达式是做什么的?这与来自执行搜索的用户的输入有关。它正在使用第二个参数中提供的模式替换query
字符串,使用第三个参数提供的值。但那正则表达式是什么?对于我的生活,它没有意义。感谢。
答案 0 :(得分:1)
@
使得必须使用第二个"
转义所有"
,""
。如果没有它来逃避"
你会使用\"
,但我认为最好总是在正则表达式中使用@
,因为\
经常被使用,而且它& #39;无聊且难以理解,总是要将其转移到\\
。
让我们看看正则表达式究竟是什么:
Console.WriteLine(@"""[^""~]+""([^~]|$)");
是
"[^"~]+"([^~]|$)
现在我们可以看看"真实"正则表达式。
它会查找"
后跟一个或多个non-" and non-~
,然后是另一个"
,后跟non-~ or the end of the string
。请注意,匹配可以在字符串开头之后开始,可以在字符串结尾之前结束(使用non-~
)
例如在
中car"hello"help
它会匹配"hello"h
答案 1 :(得分:1)
据我所知,xanatos的回答是正确的。我试图理解正则表达式,所以它来了:
"[^"~]+"([^~]|$)
您可以测试我们的正则表达式并使用单个部分来更好地理解http://www.regexpal.com/
1。)一个字符
“
第一个模式是文字字符。由于没有相对位置的陈述,它可以在任何地方出现。
2。)一个角色类
[^“〜]
下一个表达式是[] -bracket。这是一个字符集。它定义了一定数量的字符,接下来可能会跟随。它是一个单个字符的占位符...所以让我们看看里面,允许哪些内容:
^“〜
字符类的定义以插入符号(^)开头,它是一个特殊字符。在开始方括号后键入一个插入符将取消字符类。所以它是“倒置”:跟随的所有内容,与类表达式不匹配,匹配并且是有效字符。
在这种情况下,每个文字字符都是可能的,除了两个被排除的字符:“或〜。
3.)一个特殊的角色
+
下一个表达式,加号,告诉引擎尝试匹配前一个令牌一次或多次。 因此,定义的字符类应重复一次或多次以匹配给定的表达式。
4.)一个字符
“
为了匹配,表达式还应该包含另外一个撇号,它将是1中第一个的相应撇号。)因为(2.)因此(3.)中的字符类不允许撇号。 / p>
5.)一个环顾
([^〜] | $)
这里要检查的第一个结构是()-bracket。这称为“外观”。 它是一种特殊的群体。 Lookaround匹配一个位置。它不会扩展正则表达式匹配。 所以这意味着这部分不会尝试在表达式中找到任何特定字符 而不是将它们本地化。
本地化需求有两个条件,它们通过管道符号由逻辑OR连接:| 所以匹配表达式的下一个字符可以是 [^〜]一个单个字符出类的所有东西除了字符〜 要么 $行的结尾(或者,如果在regex引擎中没有使用多行模式,则为单词)
我会尝试将我的答案编辑为更好的格式,因为这是我的第一篇文章,我首先要看一下这是如何工作的.. :)
更新: 要“检测”行前/行尾的星号/星号,你必须执行以下操作:
首先它是一个特殊的角色,所以你必须用反斜杠来逃避它:*
要定义位置,您可以使用:
总体表达式为:
^ *在表达式前面搜索*的开头 正则表达式末尾的行$ *最后要求*。
....在你的情况下,你可以在最后一个字符类中添加*以在最后检测*:
([^〜] | $ | $ *)
并强制执行*,删除其他条件:
($ *)
PS: (不知何故,我的正则表达式被形成引擎吞噬了,所以我的更新是错误的......)