试图概括正则表达式

时间:2016-08-12 21:20:35

标签: java regex

我尝试创建一个正则表达式,在第二个点后分割字符串。

例如:字符串"AF23.2016.12"应该分割{"AF23.2016", ".12"}

到目前为止,我得到了跟随正则表达式的分裂:

"(?<=(\\p{Alnum}+)\\.(\\p{Alnum}{4}))(?=\\.)"

这适用于此字符串,但我必须指定第二部分(\\p{Alnum}{4})的长度,但它是变体。

我尝试使用+代替{4},但如果这样做,则拆分不起作用。结果:"AF23.2016.12"

如何将第二部分概括为任何长度?

3 个答案:

答案 0 :(得分:2)

如果您尝试"(?<=\\.(\\p{Alnum}+))(?=\\.)",则会出现例外

  

Look-behind组没有明显的最大长度

(我不知道为什么你没有得到两个+的消息;也许你应该这样做。)但它会让你知道你可以做些什么来使它工作:限制长度后视组。而不是无限+使用类似{1,1000}的内容。这对我有用:

"(?<=(\\p{Alnum}{1,1000})\\.(\\p{Alnum}{1,1000}))(?=\\.)"

(空间和/或时间要求可能会从选择较小的重复限制中受益。我还没有检查过。)

答案 1 :(得分:1)

不使用拆分,最好使用捕获的组使用匹配:

(\w+\.\w+)(\.\w+)

RegEx Demo

在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