用于查找20个字符内的第二个空格的正则表达式

时间:2014-10-30 04:02:06

标签: java regex

我正在尝试编写与此格式的字符串匹配的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)

3 个答案:

答案 0 :(得分:1)

^([^ ]+[ ][^ ]+)[ ](.*)$|(.{20})(.*)$

你可以尝试一下。抓住捕获物。

1)([^ ]+[ ][^ ]+)[ ](.*)将在第二个空格中断开

2)(.{20})(.*)将打破20个字符。

参见演示。

http://regex101.com/r/gT6kI4/4

答案 1 :(得分:1)

这是我的解决方案,它使用了lookbehind:

"([^ ]*(?:[ ][^ ]*)?)(?<!.{21})[ ]?([^ ]{0,20})"

([^ ]*(?:[ ][^ ]*)?)(?<!.{21})匹配并捕获第一部分,第一部分必须严格少于21个字符包含最多一个空格。由于贪婪的量词,它总是首先尝试最长的字符串(总是首先匹配第一个空格),并在受到后视限制时减少其长度。 lookbehind只允许匹配器在你找不到匹配的21个字符时继续进行,这意味着前面的部分少于20个字符。

由于第一部分可以以空格结尾,因此我需要将其与[ ]?匹配。

然后,由于第二部分不能包含任何空格(因为它在第一个空格处断开),它可以简单地由([^ ]{0,20})匹配和捕获。

请注意,此解决方案假定输入字符串中没有行分隔符字符。

有一个警告:第一部分可能包含尾随空格,如果它是第一个空格而且它是第20个字符。您可以通过进行一些小改动来防止这种情况:

"([^ ]*(?:[ ][^ ]+)?)(?<!.{21})[ ]?([^ ]{0,20})"
                 ^

Demo on ideone

答案 2 :(得分:0)

我不认为这可以使用一种正则表达式来完成 我建议先运行这种模式:
^(.{20})(.*)$
如果子模式没有。 1包含多个空格然后失败并改为运行此模式 ^(\S+\s\S+)\s(.*)$