我尝试创建一个正则表达式,在第二个点后分割字符串。
例如:字符串"AF23.2016.12"
应该分割{"AF23.2016", ".12"}
到目前为止,我得到了跟随正则表达式的分裂:
"(?<=(\\p{Alnum}+)\\.(\\p{Alnum}{4}))(?=\\.)"
这适用于此字符串,但我必须指定第二部分(\\p{Alnum}{4})
的长度,但它是变体。
我尝试使用+
代替{4}
,但如果这样做,则拆分不起作用。结果:"AF23.2016.12"
如何将第二部分概括为任何长度?
答案 0 :(得分:2)
如果您尝试"(?<=\\.(\\p{Alnum}+))(?=\\.)"
,则会出现例外
Look-behind组没有明显的最大长度
(我不知道为什么你没有得到两个+
的消息;也许你应该这样做。)但它会让你知道你可以做些什么来使它工作:限制长度后视组。而不是无限+
使用类似{1,1000}
的内容。这对我有用:
"(?<=(\\p{Alnum}{1,1000})\\.(\\p{Alnum}{1,1000}))(?=\\.)"
(空间和/或时间要求可能会从选择较小的重复限制中受益。我还没有检查过。)
答案 1 :(得分:1)
不使用拆分,最好使用捕获的组使用匹配:
(\w+\.\w+)(\.\w+)
在Java中:
Pattern p = Pattern.compile( "(\\w+\\.\\w+)(\\.\\w+)" );
然后使用Matcher
API获取两个捕获的组。
答案 2 :(得分:0)
这个正则表达式看起来像你想要的那样:
^([A-F0-9]+?\.[A-F0-9]+?)\.([A-F0-9]+)$
或使用\\p{Alnum}
语法:
^(\\p{Alnum}+?\.\\p{Alnum}+?)\.(\\p{Alnum}+)$
我不确定你在什么情况下使用这个正则表达式。此处的结果将第一和第二部分放入\1
,\2
。