2013-08-05 177 views
0

我工作的一些代码,从别人那里继承并试图了解在C#中的一些正则表达式代码:正则表达式替换字符串

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

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

+0

是否[参考](http://www.regular-expressions.info/reference.html ) 帮帮我? – Corak

回答

1

据我所知,xanatos的答案是正确的。我试着去了解正则表达式,所以这里说到:

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

您可以测试我们的正则表达式,并在http://www.regexpal.com/

1.与单件起到更好的理解)单个字符

第一种模式是文字字符。由于没有相对立场的陈述,它可能发生在任何地方。

2.)在字符类

[^“〜]

下一个表达式是[] -bracket,这是一个字符集,它定义字符的数量,这可能会在下一步。它是一个单个字符的占位符。所以让我们看看里面,允许其内容:

^“〜

字符类的定义开始的插入符号(^),这是一个特殊字符,在打开方括号后键入一个插入符号将取消字符类别,因此它是“倒置的”:跟随的所有内容,与类别表达式不匹配,匹配且是有效字符。在这种情况下,每个字面字符都是可能的,除了两个被排除的字符:“或〜”。

3.)的特殊字符

+

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

4.)单个字符

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

5.)一个环视

([^〜] | $)

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

本地化需求有两个条件,它们通过管道符号进行逻辑OR连接: 因此,匹配表达式的下一个字符可以是 [^〜]所有类中的单个字符除了字符〜 或 $行末(或单词,如果不使用多行模式正则表达式引擎)

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

更新: 以“检测”在该行的前/结束一个星/星,你必须做以下几点:

首先,它是一个特殊的角色,所以你有一个反斜杠转义:*

要定义的位置,你可以使用:

  • ^看行的开头,该行的
  • $结束

整体表现将是:

^*的表达在 开始寻找一个*前面的正则表达式的最后行$ *在终端需求的* 。

....你的情况,你可以在最后一个字符类中添加*检测到底有*:

([^〜] | $ | $ *)

,并强制*最后,删除其他条件:

($ *)

PS: (不知我的正则表达式是在格式化的发动机吞了,所以我的更新是错误的...)

+0

谢谢,@EpicEmil。你浏览了每一个正则表达式并且解释得很好。非常感激 :) – Alex

1

@使得有必要跳过所有的"与第二个",所以""。如果没有它可以逃脱",你可能会使用\",但我认为总是在正则表达式中使用@会更好,因为\经常使用,而且它永远不得不将其转义到\\,因为它经常被使用。

让我们看看正则表达式真的是:

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

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

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

它寻找"后面紧跟着另一个"随后是non-~ or the end of the string一个或多个non-" and non-~。需要注意的是,比赛可以字符串开始后启动,它可能结束的字符串(用non-~

例如在

car"hello"help 

年底前,将匹配"hello"h

+0

谢谢,xanatos。后续操作:如何在字符串的开头或结尾检测一个'*'? – Alex

+1

@Alex您必须将其转义为''' \ *'...但是你的意思是“检测”?一个可选的'* *'是'\ *?',所以你可以写@“\ *?”“[^”“〜] +”“([^_] | $)“(如果你希望*之外的*),然后用标准字符串方法检查是否有'*'。最后的'[^〜]'已经吃了'*' – xanatos

+0

谢谢@xanatos。检测是错误的词 - 要知道该模式存在并取代它。所以没有可以检测最后一个'*'的正则表达式模式?推荐使用'lastIndexOf()'来做到这一点,并以某种方式将两者合并为一张支票? – Alex