我有以下输入字符串: “winslow homer harper每周一次”神枪手的纠察队义务“原创”
以下正则表达式:
(?<ModBroadBeg>.+)(?<modBroadWord>(^| )*winslow *)(?<ModBroadEnd>.*)
以下正则表达式/替换表达式:
${ModBroadBeg}+${modBroadWord}${ModBroadEnd}
以下C#代码。我想用“+ winslow”取代“winslow”
NewKeyWordOutString = Regex.Replace(NewKeyWordOutHoldString, BuildKeywordReplaceStruct, ReplaceModBroadWord);
我在RegexBuddy中对此进行了测试,但它确实有效。上面的代码适用于本垒打,哈珀和每周。让我相信“winslow”存在问题,因为它是字符串的开头。我在Visual Studio中测试过,如果我在“winslow”前放置一个空格,那么正则表达式就可以了。
答案 0 :(得分:1)
(?<ModBroadBeg>.+)(?<modBroadWord>(^| )*winslow *)(?<ModBroadEnd>.*)
此表达式将匹配一个输入,该输入具有一个或多个字符(.+
),后跟输入的零个或多个开头(这是不可能的)或空格((^| )*
)后跟winslow
有零个或多个尾随空格(winslow *
)后跟零个或多个字符(.*
)。
基本上,这不会与以winslow
开头的输入相匹配。
如果您只想将winslow
的所有实例替换为+winslow
,那么您可以使用:
(?=winslow)
使用zero-width positive lookahead assertion匹配winslow
之前的位置,并用+
替换零长度字符串(实际上,这是在特定点插入内容的一种方式)。
如果您想匹配foo winslow bar
中的“winslow”,但foowinslow bar
或foo winslowbar
中的不是,则可以使用word boundaries( \b
)匹配单词的开头/结尾,如下所示:
(?=\bwinslow\b)
字边界用于检测边界一侧的字符何时为空白而另一侧的字符不是。当单词以输入的开头或结尾为界时,它们也有效,例如winslow foo bar
和foo bar winslow
。