我正在尝试编写与此格式的字符串匹配的Java regexp:
AXXXXYYYYB
其中 XXXX 是一个终结于第20个字符或第二个空格的字符串,以先到者为准, YYYY 是一个字符串终止于第20个字符或第一个空格,以先到者为准。
我需要 XXXX 和 YYYY 作为第一个和第二个捕获组。
我可以通过以下方式终止 XXXX 中的第一个空间:
^A([^ ]{1,20}) ?([^ ]{1,20})B$
但我无法弄清楚终止于第20个字符或第二个空间的规则。
另外,如果任何一个捕获组最终都有一个额外的前导或尾随空间,我也不在乎。
样本输入 - >输出:
MR SMITH BROOKLYN -> "MR SMITH" and "BROOKLYN" (separated at second space)
MR SMYTHE-JONES BRONX -> "MR SMYTHE-JONES" and "BRONX" (separated at second space)
12345678901234567890QUEENS -> "12345678901234567890" and "QUEENS" (separated at 20th character)
1234567890 1234567890QUEENS -> "1234567890 123456789" and "0QUEENS" (separated at 20th character)
1234567890 1234567890STATEN ISLAND -> "1234567890 123456789" and "0STATEN" (separated at 20th character, then separated at space)
答案 0 :(得分:1)
^([^ ]+[ ][^ ]+)[ ](.*)$|(.{20})(.*)$
你可以尝试一下。抓住捕获物。
1)([^ ]+[ ][^ ]+)[ ](.*)
将在第二个空格中断开
2)(.{20})(.*)
将打破20个字符。
参见演示。
答案 1 :(得分:1)
这是我的解决方案,它使用了lookbehind:
"([^ ]*(?:[ ][^ ]*)?)(?<!.{21})[ ]?([^ ]{0,20})"
([^ ]*(?:[ ][^ ]*)?)(?<!.{21})
匹配并捕获第一部分,第一部分必须严格少于21个字符,包含最多一个空格。由于贪婪的量词,它总是首先尝试最长的字符串(总是首先匹配第一个空格),并在受到后视限制时减少其长度。 lookbehind只允许匹配器在你找不到匹配的21个字符时继续进行,这意味着前面的部分少于20个字符。
由于第一部分可以以空格结尾,因此我需要将其与[ ]?
匹配。
然后,由于第二部分不能包含任何空格(因为它在第一个空格处断开),它可以简单地由([^ ]{0,20})
匹配和捕获。
请注意,此解决方案假定输入字符串中没有行分隔符字符。
有一个警告:第一部分可能包含尾随空格,如果它是第一个空格而且它是第20个字符。您可以通过进行一些小改动来防止这种情况:
"([^ ]*(?:[ ][^ ]+)?)(?<!.{21})[ ]?([^ ]{0,20})"
^
答案 2 :(得分:0)
我不认为这可以使用一种正则表达式来完成
我建议先运行这种模式:
^(.{20})(.*)$
如果子模式没有。 1包含多个空格然后失败并改为运行此模式
^(\S+\s\S+)\s(.*)$