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