我想从字符串中提取数字和仅数字
假设我有一个这样的字符串:"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.
答案 0 :(得分:1)
(?<=^|\s)[0-9]+?(?=\s|$|\.(?=\s|$)|[;,\"'!?])
会奏效 这个正则表达式的一个优点是它可以很容易地修改。
说明:
(?<=^|\s)
是Positive Lookbehind。
(?<=
开始积极的外观。^|\s
匹配以下either:
^
一个start-of-string anchor,\s
任何空格或换行符。)
结束了积极的外观。[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}
。