正则表达式找不到字符串的开头

时间:2018-01-22 18:40:43

标签: c# .net regex

我有以下输入字符串: “winslow homer harper每周一次”神枪手的纠察队义务“原创”

以下正则表达式:

(?<ModBroadBeg>.+)(?<modBroadWord>(^| )*winslow *)(?<ModBroadEnd>.*)

以下正则表达式/替换表达式:

${ModBroadBeg}+${modBroadWord}${ModBroadEnd}

以下C#代码。我想用“+ winslow”取代“winslow”

NewKeyWordOutString = Regex.Replace(NewKeyWordOutHoldString, BuildKeywordReplaceStruct, ReplaceModBroadWord);

我在RegexBuddy中对此进行了测试,但它确实有效。上面的代码适用于本垒打,哈珀和每周。让我相信“winslow”存在问题,因为它是字符串的开头。我在Visual Studio中测试过,如果我在“winslow”前放置一个空格,那么正则表达式就可以了。

1 个答案:

答案 0 :(得分:1)

(?<ModBroadBeg>.+)(?<modBroadWord>(^| )*winslow *)(?<ModBroadEnd>.*)

此表达式将匹配一个输入,该输入具有一个或多个字符(.+),后跟输入的零个或多个开头(这是不可能的)或空格((^| )*)后跟winslow有零个或多个尾随空格(winslow *)后跟零个或多个字符(.*)。

基本上,这不会与以winslow开头的输入相匹配。

如果您只想将winslow的所有实例替换为+winslow,那么您可以使用:

(?=winslow)

使用zero-width positive lookahead assertion匹配winslow之前的位置,并用+替换零长度字符串(实际上,这是在特定点插入内容的一种方式)。

如果您想匹配foo winslow bar中的“winslow”,但foowinslow barfoo winslowbar中的不是,则可以使用word boundaries\b)匹配单词的开头/结尾,如下所示:

(?=\bwinslow\b)

字边界用于检测边界一侧的字符何时为空白而另一侧的字符不是。当单词以输入的开头或结尾为界时,它们也有效,例如winslow foo barfoo bar winslow