【问题标题】:Perl Regex Conditional: named group inside embedded codePerl Regex Conditional:嵌入代码中的命名组
【发布时间】:2015-03-31 23:55:24
【问题描述】:

我是 Perl 的初学者,但我确实知道如何使用正则表达式。

现在我遇到了一个问题,因为我不知道在 Perl 中应该使用什么语法来做我想做的事情。

在我正在制作的 RE 中,我需要命名一个组(仅由一个字符组成),然后在嵌入的代码中使用它来查看该字符是否等于“a”,例如,如果它是否应该使用 if 语句来匹配我想要的...

我认为语法应该是这样的:

(echo base; echo case;) | perl -ne 'print if /^ *(?<char>[^*\/#" ])(?(?{<char> eq c})ase)/'

在本例中,我想匹配字符串 case,但它匹配任何后跟 ase 的字符(如 base,在例子)。这真是令人沮丧...

任何对 Perl 有更多经验的人可以告诉我正确的方法来获得这个条件吗?

非常感谢!

编辑:在示例中,我想评估组 char。它应该只匹配具有 char == 'c' 的行,如果是这样,那么 'ase' 将用作条件中的 IF 语句,因此匹配大小写,但不匹配基础。 ..

【问题讨论】:

  • 我想发明一把刀,让我做一个鸡肉咖喱三明治。也许您应该只编写常规代码来完成这项工作?或者更清楚地说明您需要做什么,以及一些测试用例。
  • 您可以使用前瞻断言来检查特定字符的存在,例如(?=c)
  • 这会有点落后,但我无法让它工作,因为我需要评估组 匹配的内容...
  • 我在一个更复杂的脚本中使用了这个概念。这是我能想出的最简单的例子来描述我的问题......脚本已经工作了,但有时我需要检查我是否已经匹配了示例中的第一个字符,在这些情况下,RE 无法表现为它应该...

标签: regex perl


【解决方案1】:

您不能使用(?{ code }) 更改匹配结果,因为它永远不会为假(perlre):

这个零宽度断言评估任何嵌入的 Perl 代码。它总是成功,并且[...]

【讨论】:

  • 我不想更改结果,我想使用条件检查组是否等于给定字符。我知道 (?()RE) 有效,但单独匹配不是条件,我想要 if(char=='c') ...
  • 抱歉,我不知道如何正确使用语法...在我的示例中,如何嵌入 if 语句以及 $+{char} 去哪里?
  • @dse:我不明白你想做什么,所以我帮不了你。
  • 实际上,经过一番搜索和您的建议,我最终得到了我想要的结果:(echo qwert; echo base; echo case;) | perl -ne '打印 if /^ *(?[^*\/#" ])(?(?{$+{char} eq c})ase|_x_x_x_)/'
  • 如果你运行这个命令,你会看到它只匹配 'case' 而忽略了 'qwert' 和 'base'。我还必须添加一个永远不正确的 else 语句......无论如何,我不知道我是否成功地解释了我想要什么,但无论如何你的建议很有帮助!
【解决方案2】:

嗯,我想嵌入的 if-then-else 语句如下所示。

(echo qwert; echo base; echo case;) | perl -ne 'print if /^ *(?<char>[^*\/#" ])(?(?{$+{char} eq c})ase|_x_x_x_)/'

此命令仅匹配单词 case 并忽略 qwertbase

我还必须添加一个永远不匹配的 else 语句,瞧,我能够按预期评估命名组 char 的内容。

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 2017-11-11
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2010-11-02
    • 2016-10-24
    相关资源
    最近更新 更多