【问题标题】:perl regex to match all words following a characterperl 正则表达式匹配字符后面的所有单词
【发布时间】:2012-07-23 00:54:18
【问题描述】:

我不是 Perl 和正则表达式方面的专家。所以这是我的问题。

如何编写一个正则表达式来匹配字符串中指定字符右侧的所有单词并在 Perl 中分别检索每个单词?

我不明白如何匹配未指定数量的单词,然后最重要的是一次检索一个?如果这不可能,那么我在 Perl 中最好的选择是什么?

E.G.:我有一个像 b=var1+var2 这样的 C 任务。我希望能够提取var1var2(如果存在)。重要的是我不想匹配特定的var1var2,而是赋值运算符之后的任何变量。

感谢您的帮助!

【问题讨论】:

  • 请通过包含您使用的任何样本作为语料库进行测试来改进您的问题。此外,请包含格式正确的预期输出示例,以便人们了解您想要达到的结果。
  • 没有人知道确切的字符串,答案可能是任何东西——更具体。

标签: regex perl


【解决方案1】:

\G/pos 可能有用。

$_ = 'b=var1+var2';
# force further /g matches to start after the first '='
/=/g;

while (/(\w+)/g) {
    print "$1\n";
}

# prints
# var1
# var2

【讨论】:

  • 你测试过这个吗?第二个正则表达式需要一个/g 修饰符。使用/=/g 修改pos 会更简洁,之后就不需要赋值了。
  • @Borodin 我确实对其进行了测试,但将其重新键入 SO 时搞砸了。已修复,谢谢,它比手动更干净pos()=
  • 也不需要scalar。无效上下文也可以:)
  • 干得好,@ephemient。我认为我的大脑陷入了一个循环,导致了一个相当难看(和冗长)的解决方案。
【解决方案2】:

也许以下方法对你有用:

use Modern::Perl;

my $string = 'b=var1+var2';
my $after  = '=';

say for ( $string =~ /$after(.*)/ )[0] =~ /(\w+)/g;

输出:

var1
var2

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    您可以在正则表达式中使用嵌套组。因此,例如,下面的正则表达式应该匹配等式字符之后的所有单词(定义为 \w,但您可以对其进行调整)(由非 \w 分隔,但您也可以对其进行调整):

    =((?<Word>\w*)[^\w]*)*
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-20
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多