正则表达式替换字符串

时间:2013-08-05 06:43:48

标签: c# asp.net regex

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

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

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

2 个答案:

答案 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: (不知何故,我的正则表达式被形成引擎吞噬了,所以我的更新是错误的......)