从字符串中查找数字

时间:2013-12-05 00:03:55

标签: regex

我想从字符串中提取数字和数字 假设我有一个这样的字符串:"VW Golf 2009"。我可以使用正则表达式[0-9]+来提取2009部分。

当我有这样的字符串时会出现问题:"BMW 2013 i8"。我想提取2013部分,而不是8部分。

基本上,我想提取任何字符串的“year”部分,类似于以下内容:

BMW 2013 i8
VW Golf 2009
1938 CarCompany, inc. <insert car name here>
My 128th birthday is in the year 2014.
aui895h 2013 5qnui 89hth658h uab2 52h5h528h
etc.

3 个答案:

答案 0 :(得分:1)

(?<=^|\s)[0-9]+?(?=\s|$|\.(?=\s|$)|[;,\"'!?])

会奏效 这个正则表达式的一个优点是它可以很容易地修改。

说明:

  • (?<=^|\s)Positive Lookbehind
    • (?<=开始积极的外观。
    • ^|\s匹配以下either
    • )结束了积极的外观。
  • [0-9]+?是这个正则表达式的核心。
    • [0-9]匹配任何数字的单个字符(0123456789):
    • +?Possessive Quantifier一次或多次重复[0-9]
  • (?=\s|$|\.(?=\s|$)|[;,\"'!?])Positive Lookahead
    • (?=开始积极向前看。
    • \s|$|\.(?=\s|$)|[;,\"'!?]匹配以下any
      • \s任何空格或换行符。
      • $end-of-string anchor
      • \.(?=\D)字符.,如果该字符紧跟其后
        • \D任何非数字字符。
      • [;,\"'!?]以下任何字符:;,"'!?。< / LI>
    • )结束了积极的前瞻。

您还可以在此处找到另一个好的解释:http://regex101.com/r/pC6yA9

要在java中实现此功能,您可以使用以下代码:

Matcher yearMatcher = Pattern.compile("(?<=^|\s)[0-9]+?(?=\s|$|[.,;](?=\s|$)).matcher("BMW 2013 i8");
yearMatcher.find();
year = yearMatcher.group();

确保导入java.util.regex.*

答案 1 :(得分:1)

使用\b(边界)元字符(取决于你的正则表达式实现)怎么样?

\b\d+\b

或者如果你想要一个特定的数字位数:

\b\d{4}\b

答案 2 :(得分:1)

我相信\d{4}会很好地解决这个问题。

如果您想确保只匹配4位数的独立年份单词,\W\d{4}\W也可以使用。

如果您还想确保“合理”日期(4位数字,从19,20开始),您可以(19|20)\d{2}