【问题标题】:How use match in ruby?如何在红宝石中使用匹配?
【发布时间】:2015-12-07 16:55:53
【问题描述】:

我试图从文本中获取大写单词。我怎样才能使用 .match() 呢? 示例

text = "Pediatric stroke (PS) is a relatively rare disease, having an estimated incidence of 2.5–13/100,000/year [1–4], but remains one of the most common causes of death in childhood, with a mortality rate of 0.6/100,000 dead/year [5, 6]"

我需要类似的东西:

r = /[A-Z]/
puts r.match(text)

我从来没有使用过 match,我需要一个获取所有大写单词(首字母缩写词)的方法。

【问题讨论】:

  • 预期输出是什么?
  • 欢迎来到 Stack Overflow。我们希望看到您搜索过的地方以及这些地方没有帮助的原因,或者看到显示您尝试过的代码的示例,以及您对它为什么不起作用的解释。照原样,您要求我们编写一个使用 match 的教程,该教程在多个地方都有很好的记录。请阅读“How to Ask”,然后使用缺失的信息编辑您的问题。

标签: ruby regex string match


【解决方案1】:

如果你只想要首字母缩写词,你可以使用类似:

text = "Pediatric stroke (PS) is a relatively rare disease, having an estimated incidence of 2.5–13/100,000/year [1–4], but remains one of the most common causes of death in childhood, with a mortality rate of 0.6/100,000 dead/year [5, 6]"

text.scan(/\b[A-Z]+\b/)
# => ["PS"]

匹配整个单词很重要,这正是\b 提供帮助的地方,因为它标记了单词边界。

问题是当您的文本包含单个独立的大写字母时:

text = "Pediatric stroke (PS) I U.S.A"

text.scan(/\b[A-Z]+\b/)
# => ["PS", "I", "U", "S", "A"]

此时,我们需要对正在搜索的文本内容有更多的智能和预知。问题是,单字母首字母缩写词是否有效?如果没有,那么稍作修改会有所帮助:

text.scan(/\b[A-Z]{2,}\b/)
# => ["PS"]

{2,}the Regexp documentation 中进行了解释,请阅读该内容以获取更多信息。


我只想要缩写类型“ (ACRONYM) ”,在这种情况下是 PS

通过您的描述很难说出您想要什么。首字母缩写词定义为:

首字母缩写词是用作单词的缩写,由短语或单词中的初始组件组成。通常这些组件是单个字母(如 NATO 或激光)或单词或名称的一部分(如比荷卢经济联盟)。

根据Wikipedia。根据该定义,小写、全部大写和混合大小写都是有效的。

如果,你的意思是你只想要括号内的全大写,那么你可以很容易地修改正则表达式来尊重它,但是你会在你可能遇到的其他首字母缩写词上失败,要么丢失你应该想要的首字母缩写词,要么捕获其他你应该忽略的。

text = "(PS) (CT/CAT scan)"
text.scan(/\([A-Z]+\)/) # => ["(PS)"]

text.scan(/\([A-Z]+\)/).map{ |s| s[1..-2] } # => ["PS"]

text.scan(/\(([A-Z]+)\)/) # => [["PS"]]
text.scan(/\(([A-Z]+)\)/).flatten # => ["PS"]

获取文本的方式多种多样,但这只会在您查看“List of medical abbreviations”和“Medical Acronyms / Abbreviations”时打开一个新的蠕虫罐。

通常我会有一张我会接受的表格,使用一个简单的模式来捕捉任何我想要的东西,检查它是否在表格中,然后保留或拒绝它。如何做到这一点由您自己弄清楚,因为这是一个完全不同的问题,不属于这个问题。

【讨论】:

  • 谢谢!!但是当我有文本 =“小儿中风 (PS) ..诊断通常是通过计算机断层扫描 (CT/CAT 扫描) 或磁共振...”我做 text.scan(/\b[A-Z]{2, }\b/) #=> PS、CT、CAT。我只想要首字母缩写词类型“(ACRONYM)”,在这种情况下是 PS。
  • 您正在更改要求。当您提出问题时,您必须在问题中提供足够的信息,包括输入数据和预期输出。这里有一个问题:当“PS”和“CT”和“CAT”都是首字母缩略词时,代码如何区分它们?代码无法分辨,只有程序员才能基于对问题和数据的深入了解,我们没有,只有你有。同样,当您提出问题时告诉我们是您的工作。什么是有效的,什么是无效的,区分彼此的规则是什么?
【解决方案2】:

作业的错误功能。使用String#scan

【讨论】:

    【解决方案3】:

    要获取所有以大写开头的单词,请使用 String#scan\b\p{Lu}\w*\b

    text = "Pediatric stroke (PS) is a relatively rare disease, having an estimated incidence of 2.5–13/100,000/year [1–4], but remains one of the most common causes of death in childhood, with a mortality rate of 0.6/100,000 dead/year [5, 6]"
    puts text.scan(/\b\p{Lu}\w*\b/).flatten
    

    demo

    String.match() 只会为您提供第一个匹配项,而scan 将返回所有匹配项。

    正则表达式\b\p{Lu}\w*\b 匹配:

    • \b - 字边界
    • \p{Lu} - 一个大写的 Unicode 字母
    • \w* - 0 个或多个字母数字字符
    • \b - 词尾边界

    要仅匹配语言单词(由字母组成),您可以使用

    puts text.scan(/\b\p{Lu}\p{M}*+(?>\p{L}\p{M}*+)*\b/).flatten
    

    another demo

    在这里,\p{Lu}\p{M}*+ 匹配任何 Unicode 大写字母(即使是预先组合的 \p{M} 匹配变音符号),(?>\p{L}\p{M}*+)* 匹配 0 个或多个字母。

    要仅获取全大写单词,请使用

    puts text.scan(/\b(?>\p{Lu}\p{M}*+)+\b/).flatten
    

    the 3rd demo

    【讨论】:

    • 不必使用\w*\b\w* 将拾取单词字符并停在\w*\b 所做的相同位置。此外,\w 不完全是“单词”的定义,它是“变量”的常见定义,因为它包含可能导致误报的[a-z0-9_]。我建议收紧推荐的模式。 flatten 不应该是必需的,因为您没有使用捕获。
    • 我认为\w 在大多数情况下已经足够了。但是,我更新了一个仅匹配语言单词的解决方案。
    • 其实\w* 部分正确,但我认为它不能满足 OP 的需求。
    • 由于 OP 不清楚(我需要一种获取所有大写单词(首字母缩写词)的方法)我添加了两种不同的解决方案。
    【解决方案4】:

    是的,您可以为此使用String#match。这可能不是最好的方法,但你没有问是否是。你必须这样做:

    text.split.map { |s| s.match(/[A-Z]\w*/) }.compact.map { |md| md[0] }
      #=> ["Pediatric", "PS"]
    

    如果您事先知道text 包含两个以大写字母开头的单词,您可以这样写:

    text.match(/([A-Z]\w*).*([A-Z]\w*)/)
    [$1,$2]
      #=> ["Pediatric", "PS"]
    

    请注意,使用正则表达式不是您唯一的选择:

    text.delete('.,!?()[]{}').split.select { |str| ('A'..'Z').cover?(str[0]) }
      #=> ["Pediatric", "PS"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      相关资源
      最近更新 更多