如何使用 Perl 中的正则表达式匹配字符串中第 n 个索引处的字符/字母/符号/数字

Posted

技术标签:

【中文标题】如何使用 Perl 中的正则表达式匹配字符串中第 n 个索引处的字符/字母/符号/数字【英文标题】:How to match character/letter/symbol/digit at nth index in a string using regex in Perl 【发布时间】:2022-01-17 12:15:10 【问题描述】:

我试图使用正则表达式匹配第 n 个索引处的字符串的字符/字母/符号/数字。

我的字符串是一个服务器名称,可以是这样的 10 - 11 个字符的字符串。

$string = gfoobar9gac 即在 9g 之后它可以是任何东西,它可以是 10 个字符或 11 个字符

我尝试了以下选项

   if ("$string" =~ m/\w[8]g/i)
      print "worked.\n";
    else 
      print "Not worked\n";
    

m/\w[8]g/i - 不工作 m/g*.1g.*/i - 工作但如果字符串包含另一个 9g (gfoobar9g9g) 它不起作用,更具体地说,我只需要索引 8 处的 g @ 987654327@ - 这个也失败了,因为字符串中可能有 2 个 9g。

有人可以仅使用正则表达式提出其他建议吗?

谢谢,

【问题讨论】:

你能说得更具体点吗?字符串gfoobar9g9g 的预期结果是什么? 我怀疑这个问题与标记不重复,但请编辑问题以使其更清晰 我投票决定重新开放,在这种情况下我想解释一下。另一个被标记为副本的页面是关于正则表达式本身的问题,比较它的方式。这是一个通用的编程问题(即使它要求使用正则表达式),并且并不是特定的正则表达式技术会产生最佳答案(即使它可能会产生),而且,这些答案确实不直接,也不完整地回答这个问题,盲目地应用它们可能会遗漏一些内容。最后,我考虑到其他人已经投票重新开放。 供参考和任何人的评论,该问题被标记为重复的其他页面是:Using explicitly numbered repetition instead of question mark, star and plus 查看 Perl 正则表达式教程。 perldoc.perl.org/perlretut 【参考方案1】:

用于指定matching repetitions数量的语法是

所以要检查g是否是$string中的第9个字符

$string =~ /^\w8g/

这假定g 前面是“单词”字符的限制,与\w 匹配。要匹配 任何 字符,请使用模式.。锚点是必需的,因为没有它,您只需检查 g 前面是否有 8 个单词字符,无论它在字符串中的什么位置。

为了捕获一个未知的第 9 个字符

my ($char) = $string =~ /^\w8(.)/;

($char) 中的括号需要对匹配运算符施加一个列表上下文,以便它返回实际匹配项(在本例中为一个匹配项),而不仅仅是真/假。

然后检查$char是否在$string中的$n-th位置

$n_prev_chars = $n - 1;

if ( /$string =~ /^\w$n_prev_chars$char/ ) ...

我不知道为什么只限制正则表达式,但让我也说明一个基本的基于substr 的方式

if ( substr($string, $n, 1) eq $char ) ...

【讨论】:

以上是关于如何使用 Perl 中的正则表达式匹配字符串中第 n 个索引处的字符/字母/符号/数字的主要内容,如果未能解决你的问题,请参考以下文章

如何匹配 perl 正则表达式 (regexp) 中的重音字符和波浪字符?

Perl:转义字符串中的特殊字符以匹配正则表达式

Perl 正则表达式 |如何从文件中排除单词

如何在 JavaScript 中的字符串中间进行锚定正则表达式匹配

我应该使用 \d 还是 [0-9] 来匹配 Perl 正则表达式中的数字?

perl 正则表达式 模糊匹配