【问题标题】:Regex match all word pairs正则表达式匹配所有单词对
【发布时间】:2021-09-09 17:36:22
【问题描述】:

我正在尝试从一段文本中提取所有单词对。

我有以下正则表达式(\w+) +(\w+),我在一段没有标点符号的文本上运行。我的问题是这没有考虑所有可能的对

$ echo "hello dear world" | grep -Eoi "(\w+) +(\w+)"
hello dear 

我想要以下

$ echo "hello dear world" | grep -Eoi [some expression]
hello dear 
dear world

【问题讨论】:

    标签: regex grep


    【解决方案1】:

    传统的grep 不会返回捕获组。

    您可以考虑 pcregrep 具有前瞻和 2 个捕获组:

    echo "hello dear world" | pcregrep -o1 -o2 '(\w+)(?=(\h+\w+))'
    
    hello dear
    dear world
    

    如果你没有pcregrep,那么你可以使用这个简单的awk

    awk '{for (i=1; i<NF; ++i) print $i OFS $(i+1)}' <<< "hello dear world"
    
    hello dear
    dear world
    

    【讨论】:

      【解决方案2】:

      对于您显示的示例,这里还有 1 个在 awk 程序中执行此操作(使用任何版本的 awk 这应该可以正常工作)。

      echo "hello dear world" | awk '{for(i=2;i<NF;i++){$i=$i ORS $i}} 1'
      

      解释: 简单的解释是,通过echo 命令打印值并将其​​作为标准输入发送到awk 程序。然后在awk 程序中,遍历字段(只有偶数字段),用它们自己的值重新分配这些字段,然后是新行和它们自己的值,然后打印已编辑/未编辑的行。

      【讨论】:

        【解决方案3】:

        使用 GNU awk 进行多字符 RS 和 \s 速记:

        $ echo "hello dear world" | awk -v RS='\\s+' 'NR>1{print p OFS $0} {p=$0}'
        hello dear
        dear world
        

        【讨论】:

          【解决方案4】:

          Perl 允许环视,因此您可以使用一种通用技术来匹配重叠文本与正向预视内的捕获组:

          perl -lne 'print "$1" while /\b(?=(\w+\s+\w+))/g' file
          

          查看online demo

          s="hello dear world"
          perl -lne 'print "$1" while /\b(?=(\w+\s+\w+))/g' <<< "$s"
          

          输出:

          hello dear
          dear world
          

          请参阅regex demo详情

          • \b - 单词边界
          • (?=(\w+\s+\w+)) - 一个积极的前瞻,需要(立即在当前位置的右侧):
            • (\w+\s+\w+) - 捕获组 1:
              • \w+ - 一个或多个单词字符
              • \s+ - 一个或多个空格
              • \w+ - 一个或多个单词字符

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-03
            • 1970-01-01
            • 1970-01-01
            • 2017-07-21
            • 2014-12-23
            • 2014-10-22
            • 2018-07-18
            • 1970-01-01
            相关资源
            最近更新 更多