【问题标题】:Extract using regex使用正则表达式提取
【发布时间】:2023-10-15 16:02:01
【问题描述】:

我是 Ruby、Regex 和 * 的新手。 xD 这是我的问题:

我想使用正则表达式来提取由具有标准 ASCII 字符的连续单词组成的短语,并将其与越南文本中的其他单词区分开来。

换句话说,只有 \w 个字符的短语,例如:

Mình rất thích con Sharp này (mặc dù chưa xài bao h nhưng chỉ nghe các pác nói mình đã thấy phê lòi mắt rồi)。 Các bạn cho mình hỏi 1 câu (các bạn đừng chê mình ngu nhé tội nghiệp mình) : cái máy này đem sang Anh dùng mạng Vodafone là dùng vô tư ah`? Nếu dùng được bên Anh mà không phải chọc ngoáy j thì mình mua một cái

不要关心它的含义,我想要实现的是一个包含 2 对结果的哈希数组:value => 提取的短语的值,starting_position => 第一个字符的位置

按照关于的例子,应该是这样的: [{:value=>"con Sharp", :starting_position => 16}, {:value=>"bao h", :starting_position => blah blah}...]

这意味着所有包含 \W 字符的单词,例如“mình”、“rất”、“thích”等都会被拒绝。

rubular.com 上为 Ruby 1.9.2 尝试使用此正则表达式的上述示例:

\b[\w|\s]+\b

我几乎得到了我想要的短语(只有空格的短语除外),但它似乎不适用于我的 Ruby,它也是 1.9.2p290,使用 Win 7 64 位。

任何想法都将受到高度赞赏。提前谢谢你。

【问题讨论】:

    标签: ruby regex rubular


    【解决方案1】:

    根据 rubular,它看起来像 \w 匹配所有 ascii 字母和数字(和下划线),但 \b 对所有 Unicode 字母都适用。这有点令人困惑。

    然而,你想要的是所有 ASCII 字的序列。这应该匹配他们:

    /\b[a-z]+\b(?:\s+[a-z]+)*\b/i
    

    工作示例:http://www.rubular.com/r/1iewl7MpJe

    快速解释:

    • \b[a-z]+\b - 第一个 ASCII 字。
    • (?:\s+[a-z]+) - 任意数量的空格和单词 - 每次至少一个空格和一个字母。
    • \b - 确保最后一个词不会在另一个词的中间结束,例如 "con Sharp này" 中的 n

    我不确定获取哈希值,但你可以获取所有MatchDatas,类似于:
    How do I get the match data for all occurrences of a Ruby regular expression in a string?

    s = "hello !@# world how a9e you"
    r = /\b[a-z]+\b(?:\s+[a-z]+)*\b/i
    
    matches = s.to_enum(:scan, r).map { Regexp.last_match }
               .map {|match| [match.to_s(), match.begin(0)]}
    puts matches 
    

    这是一个关于 ideone 的示例:http://ideone.com/YRZE5

    【讨论】:

    • 看起来\b\w+\b(?:\s+\w+)*\b 也可以。我不确定为什么我认为 \w 确实匹配所有 Unicode 字母......无论如何,我会检查一些文档。我在ruby-doc.org/core-1.9.3/Regexp.html中找不到它
    • 太棒了!太感谢了。顺便说一句,如何使用 Ruby 获得如上所述的结果数组?我试过 scanmatch 但不知道如何处理?
    • @ThiemNguyen - 谢谢!我添加了一个获取所需数据的示例。除了回答 Stack Overflow 问题之外,我真的不了解 Ruby,所以你可能比我做得更好:P
    • 我设法使用 Ruby 和您的正则表达式提取了它们。提前致谢。 xD