正则表达式如何精确匹配字符串?

27

首先,我想提到的是,虽然我远非正则表达式大师,但我并不完全陌生。通常建立一个用于在特定字符串中搜索模式的正则表达式对我来说并不是问题,但我有一个(也许?)独特的情况。

我有一组值,例如:

028938
DEF567987
390987.456
GHI345928.039

我想匹配某些字符串,例如:

  • 由恰好6个数字组成的字符串
  • 由恰好6个数字、一个小数点和恰好3个数字组成的字符串

在上面的例子中,第一个和第三个值应该匹配。

我使用以下正则表达式:

[0-9]{6}
[0-9]{6}.[0-9]{3}

很不幸,由于上述所有示例包含指定的模式,因此所有值都被匹配。这并不是我的意图。

所以我的问题简而言之就是如何编写一个正则表达式,精确完整地匹配一个字符串,没有额外的字符在匹配模式的左右?是否有术语来表示这种类型的匹配?(谷歌没什么帮助)TIA


4
你是如何使用这些正则表达式的?如果你使用Matcher.matches()String.matches(),就不需要开始或结束锚点,但如果你使用Matcher.find(),则需要。此外,你需要转义句点("[0-9]{6}\\.[0-9]{3}")。 - Mark Peters
1
“锚点”是指 ^$ 这两个符号。 - msw
你没有转义点,因此它将匹配许多你可能不想要的内容,请查看我的答案以获取一个非常有用的基于Web的RegEx工具和我的答案测试链接。 - user177800
谢谢,我没有意识到点被视为特殊字符。 - Craig Otis
5个回答

58

1
你的答案是错误的,你需要转义点号,并且应该使用\d代替[0-9]。 - user177800
@msw,没错,我只是复制/粘贴了Craig的可用正则表达式,我现在会修复它。 - CaffGeek
非常感谢你,Chad。感谢你提供一个可用的正则表达式,并解释了它为什么有效。 - Craig Otis
3
在Java中,“[0-9]”和“\d”表示完全相同的含义,因此使用“[0-9]”而不是“\d”不一定是错误。 - Alan Moore

8
您可以使用^来要求匹配行的开头,使用$来要求匹配行的结尾。
^[0-9]{6}\.[0-9]{3}$

[0-9]也可以写作\d。

^\d{6}\.\d{3}$

如果你想在一行中匹配有空格的模式,可以使用\b来匹配单词边界。

\btest\b

这将匹配此行中的单词test

this is a test for matching

这不会做他想要的事情,你需要转义点。 - user177800
@fuzzy: true。你可以编辑问题使其合适 :) 它将作为通配符工作,因为通配符也将匹配一个点 ;) 但是,如果存在错误答案,它也将匹配错误的答案。 - Mikael Svenson
问题本身就是错误的,而且需要保留这个错误,因为这是问题的一部分。他的语法有误,修正他的问题不会让其他遇到相同问题的人理解__正确的__答案。 - user177800
@fuzzy:这个问题是关于匹配模式/行的开头和结尾,而不是通配符“.”如何工作的。 - Mikael Svenson
不,问题是如何使用正则表达式与输入进行精确匹配,未转义的“do”会阻止这种精确匹配,起始和结束标记是一个误导,不是正确答案。他的示例并没有做他认为它正在做的事情,需要进行更正以获得完全有用的正确解决方案。 - user177800
有些人就是喜欢惹人烦,不是吗? - CaffGeek

4

2
匹配这个正则表达式:
"^\d{6}((\.\d{3}$)|$)"

或者我认为,只需 ^\d{6}(\.\d{3})?$ - CaffGeek
@Chad 不行。这不符合第一个条件 - “字符串由正好6个数字组成”。 - Gopi

2
我认为你想要这样的东西:
"^\d{6}(\.\d{3})?$"

你需要转义“点号”,因为它在正则表达式中代表着“任意”字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接