提问人:DevOpsWorld 提问时间:9/7/2023 最后编辑:halferDevOpsWorld 更新时间:9/16/2023 访问量:56
用于捕获 PCRE 中除最后 2 个字母之外的字符串的正则表达式
Regex to capture string except last 2 letters in PCRE
问:
我有一个字符串 test01、abcd02、xyz05 来自这些字符串,我将有最后 2 个字符始终是数字。从这些字符串中,我想要一个正则表达式来捕获 test、abcd、xyx。我怎样才能捕捉到它?
答:
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
这种模式太慷慨了——末端锚点上的两个点将匹配任何字符,而不仅仅是数字。
评论
(test|abcd|xyz)\d\d
(.*)..$