【问题标题】:Java regular expression matchJava正则表达式匹配
【发布时间】:2011-05-26 17:15:30
【问题描述】:

我需要匹配一个字符串以数字开头,然后是一个点,然后是一个空格和 1 个或多个大写字符。匹配必须出现在字符串的开头。我有以下字符串。

1. PTYU fmmflksfkslfsm

我试过的正则表达式是:

^\d+[.]\s{1}[A-Z]+

而且不匹配。解决这个问题的正则表达式是什么?

【问题讨论】:

  • Matches for me 但可以重写为^\d+\.\s[A-Z]+
  • {1} 是多余的:它只会使表达式混乱,并且可以(应该)删除以保持清晰。
  • 了解 Java 和正则表达式:regular-expressions.info/java.html。 @AlexR 和 @codaddict 都是对的。你需要在Java中使用\\ 创建一个\ 。

标签: java regex


【解决方案1】:

(对不起,我之前的错误。大脑现在已经牢牢地投入了。呃,可能。)

这行得通:

String rex = "^\\d+\\.\\s\\p{Lu}+.*";

System.out.println("1. PTYU fmmflksfkslfsm".matches(rex));
// true

System.out.println(". PTYU fmmflksfkslfsm".matches(rex));
// false, missing leading digit

System.out.println("1.PTYU fmmflksfkslfsm".matches(rex));
// false, missing space after .

System.out.println("1. xPTYU fmmflksfkslfsm".matches(rex));
// false, lower case letter before the upper case letters

分解:

  • ^ = 字符串开始
  • \d+ = 一个或多个数字(\ 被转义,因为它在字符串中,因此 \\)
  • \. = 文字 .(或者你原来的 [.] 很好)(再次,在字符串中转义)
  • \s = 一个空格字符(后面不需要{1})(我现在不再提及转义)
  • \p{Lu}+ = 一个或多个大写字母(使用正确的 Unicode 转义 - 谢谢你,tchrist,在下面的评论中指出这一点。用英文来说,相当于 [A-Z]+)
  • .* = 其他任何东西

详情请见the documentation here。

如果您使用像String#match(上图)这样会尝试匹配整个字符串的方法,则只需要最后的.*。

【讨论】:

  • 很难判断 OP 是否坚持使用 7 位 ASCII 数据,或者他是否需要它来处理任何 Java 字符——它们是 Unicode,而不是 ASCII。如果是后者,你当然需要做出调整。 \p{Lu} 对于大写字母可能已经足够了,但是 Java 没有提供方便的方式来讨论 Unicode 空白,所以你必须写成 [\u000A-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000],就像 I have elsewhere written。
  • 真的不应该说[A-Z]+ 匹配“一个或多个大写字母”,因为\p{Lu}+ 就是这样做的。 [A-Z]+ 仅匹配 A 到 Z 中的一个或多个(并且更喜欢更多)——我认为这略有不同但显着不同。同样,\s 不是一个空白字符,而只是[ \t\n\x0B\f\r] 之一。我只是在这里太挑剔了吗?我每天都使用 Java 和 Perl 处理大量千兆字节的 Unicode 字符语料库——但从不 ASCII——所以也许我需要比其他人更加小心。或者也许不是?
  • @tchrist:非常非常好的观点我不敢相信我做了如此以英语为中心的事情。我已经为它打勾了其他人。非常感谢你为它打勾!
  • 并修复(我之前冲出门,想先检查一下)。
【解决方案2】:

这取决于您使用哪种方法。我认为如果您使用 Matcher.find() 它将起作用。如果您使用 Matcher.matches() 它将不起作用,因为匹配适用于整行。如果您使用matches(),请按以下方式修复您的模式:

^\d+\.\s{1}[A-Z]+.*

(注意尾随.*)

我也会使用\. 而不是[.]。它更具可读性。

【讨论】:

    【解决方案3】:

    "^[0-9]+\. [A-Z]+ .+"

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 2015-06-03
      • 2011-02-17
      • 2011-01-24
      相关资源
      最近更新 更多