Ruby中用于匹配大写单词的正则表达式

4

我不太擅长使用正则表达式,感谢您的帮助。

我需要解析这样一个字符串:“sign me up for LUNCH”,以提取出大写单词。我在使用Ruby。

所以我需要类似于以下代码:

string = "sign me up for LUNCH"
keyword = string.gsub(/some_rexex/, '')
# keyword should == 'LUNCH'

感谢您的帮助。

[A-Z]+ 表示匹配一个或多个大写 ASCII 字母。 - user557597
2个回答

2

使用 string.scan 函数代替 string.gsub 来获取你想要的特定字符串。

> "sign me up for LUNCH".scan(/\b[A-Z]+\b/)[0]
=> "LUNCH"

\b被称为单词边界,它匹配单词字符和非单词字符之间的位置。

或者

> "sign me up for LUNCH".scan(/(?<!\S)[A-Z]+(?!\S)/)[0]
=> "LUNCH"
  • (?<!\S) 负向回顾后发断言,用于断言匹配项之前没有非空格字符。
  • [A-Z]+ 匹配一个或多个大写字母。
  • (?!\S) 负向先行断言,用于断言匹配项之后没有非空格字符。

几乎可以工作,但如果大写单词后面有一个单词,它也会返回那个单词。例如:“sign me up for LUNCH today” 返回“LUNCH today”。 - Doug Steinberg
然后您需要使用string.scan函数。 - Avinash Raj
2
@DougSteinberg 根据您的输入,您可能想使用\p{Upper} (或[[:upper:]])而不是[A-Z],因为它无法匹配例如"inscrivez-moi pour le DÉJEUNER"。 - matt

0

对于正则表达式的解决方案,Avinash Raj绝对有正确的解决方案。我想我可以提供另一种替代方案。

如果你想完全避免使用正则表达式,你可以迭代查询字符串,并将每个单词与其大写值进行比较。

string = "sign me up for LUNCH"
string.split(" ").each do |word|
    if (word == word.upcase)
        puts word
    end
end 

如果您需要在匹配单词时立即对其进行操作,那么这种方法可能会很有帮助。


我喜欢这个想法。我也在考虑做类似的事情,但是正则表达式似乎是更有效的方法。 - Doug Steinberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接