匹配字符串中短语的第一个单词

Posted

技术标签:

【中文标题】匹配字符串中短语的第一个单词【英文标题】:Match first word of a phrase in a String 【发布时间】:2010-01-19 07:38:06 【问题描述】:

我正在使用 Google toolbox for mac(在 Cocoa / Objective-C 中)应用程序中的 GTMRegex 类:

http://code.google.com/p/google-toolbox-for-mac/

我需要对字符串中的 3 个单词短语进行匹配和替换。我知道这句话的第二和第三个词,但第一个词不知道。

所以,如果我有:

lorem BIFF BAM BOO ipsem

lorem BEEP BAM BOO ipsem

我会注意匹配 (BEEP BAM BOO) 和 (BIFF BAM BOO)。然后我想用粗体 html 标记包装它们。

这是我所拥有的:

GTMRegex *requiredHeroRegex = [GTMRegex regexWithPattern:@"(\\([A-Z][A-Z0-9]*)\\b Hero Required)" options:kGTMRegexOptionSupressNewlineSupport|kGTMRegexOptionIgnoreCase];
out = [requiredHeroRegex stringByReplacingMatchesInString:out withReplacement:@"<b>\\1</b>"];

但是,这不起作用。基本上,我不知道如何匹配第一个单词。

有人知道 RegEx 可以做到这一点吗?

更新:

GTRegEx 使用 POSIX 1003.2 正则表达式,所以解决方法是:

GTMRegex *requiredHeroRegex = [GTMRegex regexWithPattern:@"([[:<:]][A-Z][A-Z0-9]*[[:>:]])( Hero Required)" options:kGTMRegexOptionSupressNewlineSupport|kGTMRegexOptionIgnoreCase];
out = [requiredHeroRegex stringByReplacingMatchesInString:out withReplacement:@"<b>\\1\\2</b>"];

注意单词边界的疯狂语法。

更新 2:这是 javascript 版本:

/(([A-Za-z]*?|[A-Za-z]*? [A-Za-z]*?)( Hero Required))/gm

【问题讨论】:

【参考方案1】:

您应该使用" .*? Hero Required",但是,如果它是句子的开头,它将无法捕捉短语。 对于这两种情况,请使用"( .*? Hero Required|^.*? Hero Required)"

【讨论】:

不幸的是,这些都不匹配。 我用 regexbuddy 验证了它,所以我认为问题出在代码中,而不是 regex 部分,而且我不知道 cocoa... 或者可能是该语法不适用于 GTMRegex。 GTRegEx 使用 POSIX 1003.2 正则表达式。我在原始消息中发布了解决方案。 @mikechambers 将其发布为答案并接受它,以便此问题在列表中显示为已解决。【参考方案2】:

\b([a-z][a-z0-9]*)( second third) 替换为&lt;b&gt;\1&lt;/b&gt;\2

【讨论】:

那也不匹配任何东西。

以上是关于匹配字符串中短语的第一个单词的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 URL 帮助:单词或短语

正则表达式删除第一个单词并使用 c# 将第二个单词的第一个字符大写

在文本块中查找单词/短语中字符的百分比

需要正则表达式来匹配两个单词,因为它们之间可能有任意数量的空格或其他字符

通过Python中的正则表达式优化在两个列表之间查找匹配子字符串

您可以使用 Python 正则表达式从偏移量向后搜索吗?