0

我正在处理一些从别人那里继承的代码,并试图理解 C# 中的一些正则表达式代码:

Regex.Replace(query, @"""[^""~]+""([^~]|$)", 
    m => string.Format(field + "_exact:{0}", m.Value))

上面的正则表达式是做什么的?这与来自执行搜索的用户的输入有关。query它使用第二个参数中提供的模式替换字符串,并使用第三个参数的值。但是那个正则表达式是什么?对于我的生活来说,这没有任何意义。谢谢。

4

2 回答 2

1

@使得有必要"用一秒钟来逃避所有的事情",所以""。如果没有它来转义"你会\"使用@的.\\\

让我们看看正则表达式到底是什么:

Console.WriteLine(@"""[^""~]+""([^~]|$)");

"[^"~]+"([^~]|$)

所以现在我们可以看看“真正的”正则表达式。

它查找 a"后跟一个或多个non-" and non-~后跟另一个"后跟 a non-~ or the end of the string。请注意,匹配可以在字符串开头之后开始,也可以在字符串结尾之前结束(带有 a non-~

例如在

car"hello"help

它会匹配"hello"h

于 2013-08-05T07:04:32.157 回答
1

据我所知,xanatos 的回答是正确的。我试图理解正则表达式,所以它来了:

    "[^"~]+"([^~]|$)

您可以在http://www.regexpal.com/上测试我们的正则表达式并使用单个部分以更好地理解

1.) 单个字符

"

第一个模式是文字字符。由于没有相对位置的陈述,它可以在任何地方出现。

2.) 一个字符类

[^"~]

下一个表达式是 [] 括号。这是一个字符集。它定义了一定数量的字符,这些字符可能会紧随其后。它是单个字符的占位符......所以让我们看看里面,哪些内容是允许的:

^"~

字符类的定义以插入符号 (^) 开头,它是一个特殊字符。在左方括号后键入插入符号将否定字符类。所以它是“颠倒的”:后面的所有内容,与类表达式不匹配,匹配并且是有效字符。

在这种情况下,每个文字字符都是可能的,除了两个被排除的字符:" 或 ~。

3.) 特殊字符

+

下一个表达式加号告诉引擎尝试一次或多次匹配前面的标记。所以定义的字符类应该重复一次或多次以匹配给定的表达式。

4.) 单个字符

"

为了匹配,表达式应该进一步包含一个撇号,这将是 1.) 中第一个撇号的对应撇号,因为 (2.) 中的字符类因此 (3.) 不允许撇号。

5.) 环顾四周

([^~]|$)

这里要检查的第一个结构是 () 括号。这称为“环视”。这是一个特殊的群体。Lookaround 匹配一个位置。它不会扩展正则表达式匹配。所以这意味着这部分不会尝试在表达式中查找任何特定字符,而是对它们进行本地化。

本地化需求有两个条件,通过流水线符号逻辑或连接: | 因此,匹配表达式的下一个字符可以是 [^~] 类中的一个字符,除了字符 ~ 或 $ 行尾(或单词,如果在正则表达式引擎中未使用多行模式)

我会尝试将我的答案编辑为更好的格式,因为这是我的第一篇文章,我首先必须检查它是如何工作的.. :)

更新:要“检测”行前/尾的星号/星号,您必须执行以下操作:

首先它是一个特殊字符,所以你必须用反斜杠转义它:*

要定义位置,您可以使用:

  • ^ 查看行首,
  • $ 行尾

整体表达将是:

^* 在表达式前面搜索 * 在行的开头 $* 在正则表达式的末尾要求 * 在末尾。

....在您的情况下,您可以在最后一个字符类中添加 * 以检测最后的 *:

([^~]|$|$*)

最后要强制使用 *,请删除其他条件:

($*)

PS:(不知何故我的正则表达式被格式化引擎吞没了,所以我的更新是错误的......)

于 2013-08-05T08:45:04.583 回答