【问题标题】:Pattern matching in regex in ruby or railsruby 或 rails 中正则表达式中的模式匹配
【发布时间】:2020-10-03 17:28:44
【问题描述】:

我是正则表达式的新手,并研究了可能的匹配表达式。但是我找不到我需要的东西。我想要的是删除匹配某个表达式的单词。该表达式将匹配所有忽略空格、制表符和换行符的单词。我无法在 ruby​​ 中找到正确的正则表达式。

例如:

string = 'hello world welcome'

我需要做的是将某些匹配的单词替换为以“w”开头并以“d”结尾的单词。

string.gsub(/^w.*d$/, 'human')

但我无法忽略(转义)空格(不替换)、制表符和新行。

有人可以帮忙吗?我尝试使用下面的正则表达式来逃避,但它没有发生。

string.gsub(/^w.*d$\s/, 'human')

'hello world welcome' 必须更改为 'hello human welcome',而不删除字符串中的空格、制表符和换行符。

这是我可以了解更多关于正则表达式的地方,尤其是 ruby​​。

【问题讨论】:

  • 看来您可能想要string.gsub(/\b\w[a-z]*d\b/i, 'human') #=> "hello human welcome" 之类的东西。你不想要任何一个锚。 ^ 将要求 'world' 位于要匹配并因此替换的行的开头。同样,$ 将要求 'world' 位于要匹配的行尾。单词边界,\b(又名“单词中断”)。如果字符串是'Hello underworld welcome''Hello worldly welcome',则阻止匹配。 /i 使正则表达式 大小写无关,因此它将匹配 'World'

标签: regex ruby


【解决方案1】:

如果我正确理解您的问题,正则表达式将是:

\bw[a-z]*d

请参阅 Regexr 上的 the pattern in action,它有助于生成正则表达式并准确告诉您正在做什么。

Cary Swoveland 的反应也不错。

【讨论】:

  • 谢谢:)。但是为什么它对特殊字符不起作用,而我累了 \b{[a-z]*} 它不起作用。我还尝试转义字符 \b\{[a-z]*\}
  • @hello:不要尝试在 cmets 中更改您的问题。请编辑您的问题并添加带有执行结果的真实测试用例。
  • 它不起作用是什么意思?它只是要选择不同范围的单词。 \{ 是一个转义字符,这意味着它将寻找以“{”开头的字符。但是,如果您希望您的 RegEx 实际捕获带有花括号的单词,那么 \{[a-z]*\}。你也可以看看这个\{\bw|W[a-zA-Z]*d|D\}
  • 您可以使用 Todd A. Jacobs 留下的资源来加深您的知识。
【解决方案2】:

问题

你的正则表达式有很多问题,包括:

  1. 不正确地锚定到行的开头和结尾
  2. 使用贪婪匹配器
  3. 当您只想替换第一个匹配项时,使用 String#gsub 而不是 String#sub

您可以在Regexp class 的文档中了解有关 Ruby 正则表达式引擎和表达式的更多信息。 O'Reilly 还发布了 many books 关于正则表达式,以及在几种流行语言和正则表达式引擎/实现中发现的不同功能。

解决方案

使用此特定字符串实现目标的方法不止一种。以下将起作用:

string = "hello world welcome"

# specify string instead of regex pattern
string.sub "world", "human"
#=> "hello human welcome"

# replacement using word boundaries
string.sub /\bworld\b/, "human"
#=> "hello human welcome"

# unanchored, non-greedy matching
string.sub /\bw.*?\b/, "human"
#=> "hello human welcome"

所有示例都产生相同的结果。第一个示例可能是最好的,因为您已经知道要替换哪个单词并且可以简单地指定字符串。其他示例利用:

  • \b 作为零宽度断言,使用单词边界锚定字符串或模式
  • *? 定义将匹配 最短 可能匹配的非贪婪模式

这些解决方案都适用于您发布的示例。您的里程可能会因其他输入而异。

【讨论】:

    猜你喜欢
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多