匹配字符串中短语的第一个单词
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)
替换为<b>\1</b>\2
【讨论】:
那也不匹配任何东西。以上是关于匹配字符串中短语的第一个单词的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式删除第一个单词并使用 c# 将第二个单词的第一个字符大写
需要正则表达式来匹配两个单词,因为它们之间可能有任意数量的空格或其他字符