用于捕获 PCRE 中除最后 2 个字母之外的字符串的正则表达式

Regex to capture string except last 2 letters in PCRE

提问人:DevOpsWorld 提问时间:9/7/2023 最后编辑:halferDevOpsWorld 更新时间:9/16/2023 访问量:56

问:

我有一个字符串 test01、abcd02、xyz05 来自这些字符串,我将有最后 2 个字符始终是数字。从这些字符串中,我想要一个正则表达式来捕获 test、abcd、xyx。我怎样才能捕捉到它?

正则表达式 正则表达式组 PCRE

评论

0赞 Luatic 9/7/2023
像.是什么阻止了你自己写这篇文章?(test|abcd|xyz)\d\d
0赞 DevOpsWorld 9/7/2023
@Luatic我只是举了这些字符串作为例子,如果我不清楚,对不起。我需要捕获这个词,除了最后 2 个字母是我在这里提出的要求。
1赞 Barmar 9/7/2023
因此,将捕获最后 2 个字符之前的所有内容。(.*)..$
0赞 DevOpsWorld 9/7/2023
@Barmar行得通,regex101.com/r/MF7S5A/1。谢谢
1赞 Barmar 9/7/2023
显然它有效,这是微不足道的。你想出这个有什么问题?

答:

2赞 Patrick Janser 9/7/2023 #1

几个问题:

  • 您的字符串可以多于或少于 2 位数字吗?
  • 如果它固定为两位数,那么为什么不直接去掉最后的 2 位 字符而不使用正则表达式?
  • 是因为我们必须验证输入吗?通常,什么 关于“#@123”?

如果您必须检查它是否以数字结尾,请不要 使用评论中提出的解决方案作为匹配项 任何字符,例如,你会从“Hello”中得到“Hel”。它 与截断字符串的效果相同。(.*)..$.

我个人会更精确,也会考虑 只能使用单词,以避免匹配“12345”或“!#@123”之类的内容。

我的建议是:

/^(\p{L}+)\d+$/u

解释:

  • 末尾的标志是 unicode,以便您可以处理 特殊字符,例如表情符号或其他特殊字符,而不是 知道你的输入文本是什么。u
  • 借助 PCRE,可以使用 Unicode 字符类。 这可以帮助您将任何语言中的单词字符与 、 进行匹配 这意味着 Letter。它与 处理多个代码点序列。\p{L}\w
  • 如果字符串的末尾必须是数字,则可以使用 . 如果确实只有 2 位数字,则将其替换为 .\d+\d{2}

const strings = [
  'test01',  // Ok
  'abcd02',  // Ok
  'test123', // More than 2 digits, perhaps ok also?
  'vidéo05', // Accented chars in the word, ok or not?
  '123456',  // Only digits => should it match? maybe not!
  '####03',  // Not word chars before the digits... hmm, no match.
  'Hello'    // No digits at all... no match.
];

const regex = /^(\p{L}+)\d+$/u;

strings.forEach(string => {
  const match = regex.exec(string);
  if (match) {
    console.log(`Word found in "${string}" is "${match[1]}"`);
  }
  else {
    console.log(`Does NOT match "${string}"`);
  }
});

使用PCRE,您将获得相同的结果:https://regex101.com/r/bvY3dg/1

评论

1赞 halfer 9/15/2023
对于一个非常懒惰的问题,这是一个非常好的答案。我没有你的宽容,但这是一件好事——干得好。
0赞 Patrick Janser 9/15/2023
@halfer 非常感谢!是的,你是完全正确的,我可能不应该回答这个相当懒惰的问题。他可能甚至没有看到我的答案,哈哈。正如你所说,我以后会不那么宽容!
0赞 halfer 9/15/2023
这实际上很好 - 因为你有一些赞成票,我认为这个问题不会被删除。但有些问题是如此可怕,以至于人们会投票删除,任何好的答案都会随之消失。
1赞 halfer 9/15/2023
也许不要求任何给定的问题作者回答或欣赏答案,因为无论如何,好的答案都会受到未来读者的赞赏。
0赞 DevOpsWorld 9/16/2023 #2

这个正则表达式对我有用:

(.*)..$

https://regex101.com/r/MF7S5A/1

评论

1赞 halfer 9/16/2023
这种模式太慷慨了——末端锚点上的两个点将匹配任何字符,而不仅仅是数字。