模式/正则表达式只能获取* * *如果它是记录中的唯一字段

时间:2012-09-25 17:51:23

标签: java regex pattern-matching java.util.scanner regex-lookarounds

过去几天这让我发疯了。我试图通过验证记录并同时提取一块土地,一举两得。我的策略是用正则表达式做到这一点:

private Pattern firstNumber = Pattern.compile("\\d{1}");

我理解为“行中的第一个数字(记录)。”到目前为止,这已经有效地抓住了第一个领域(并确保它是一个数字),但我想更进一步:

我如何调整正则表达式以指定仅在数字为唯一字段时才需要数字?

也就是说,如果记录只是10,我想抓住10.但是如果记录是10 4,我不想抓取任何东西(因为这是一个无效的记录该项目)。

我试过了:

private Pattern oneNumberOnly = Pattern.compile("\\d{1}\n");

但是 - 令我懊恼的是 - 这个(以及它的任何其他排列)都没有接收任何数字。这里有什么我想念的吗?

2 个答案:

答案 0 :(得分:3)

您可以使用^表示行/字符串的开头,使用$表示行/字符串的结尾,因此模式将为

^\d+$

{1}不起作用,因为它排除了包含多个数字的任何内容,例如10.使用\d+表示一个或多个数字。使用\d也可能允许小数和负值(不确定Java),因此如果您只想要数字,请将\d替换为[0-9]

顺便说一下,指定{1}总是多余的,因为默认情况下,原子匹配一次。

答案 1 :(得分:1)

您可以使用起始行字符和结束行字符。如果您尝试获取自己的数字,可以使用:

Pattern.compile("^(\\d)++$");

通过添加{1},您只能得到一个数字的1位数。你还应该修剪你要比较的字符串,以消除任何额外的空格。

  • ^ - 行首字符
  • \\d - 数字字符[0-9]
  • + - 与\ d
  • 匹配的1个或多个字符
  • + - 占有(这将抓住所有数字并且比贪婪的量词更快)
  • $ - 行尾字符