【问题标题】:Regexp for finding second space within 20 characters用于在 20 个字符内查找第二个空格的正则表达式
【发布时间】:2014-10-30 14:39:25
【问题描述】:

我正在尝试编写一个与这种格式的字符串匹配的 Java 正则表达式:

AXXXXYYYYB

其中 XXXX 是一个在第 20 个字符或 second 空格处终止的字符串,以先到者为准,而 YYYY 是一个字符串在第 20 个字符或 first 空格处终止,以先到者为准。

我需要 XXXXYYYY 作为第一和第二个捕获组。

我可以让它在 XXXX 中的 first 空间终止工作:

^A([^ ]{1,20}) ?([^ ]{1,20})B$

但我不知道终止于第 20 个字符或 second 空格的规则。

另外,我不在乎任何一个捕获组是否以额外的前导或尾随空格结束。

示例输入 -> 输出:

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)

【问题讨论】:

  • 你能提供一些预期输出的例子吗?
  • 是的,我一点击保存就注意到了它,并在您发布澄清请求时修复了它。对不起!
  • 只有 1 个空格和少于 20 个字符的字符串会怎样?
  • 第一个字符串以第二个空格或第 20 个字符结束,以先到者为准。从那时起,第二个字符串在第 20 个字符或第一个空格处结束。如果没有足够的字符,那么什么都不会匹​​配。 “A B”将匹配为“A B”和“”。

标签: java regex


【解决方案1】:
^([^ ]+[ ][^ ]+)[ ](.*)$|(.{20})(.*)$

你可以试试这个。抓拍。

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

2)(.{20})(.*) 将中断 20 个字符。

查看演示。

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

【讨论】:

  • 如果第一个字符串>20个字符但总字符串中有两个空格,这将返回第一个>20个字符的字符串。 MR SUPERDUPERLONGNAMESMITH BROOKLYN 将返回第一个字符串太长。您错过了“以先到者为准”部分。
  • 更接近,但 MR SMITHERLY BROOKLYN 中断为 MR SMITHERLY BROOKLYN 而不是 MR SMITHERLYBROOKLYN
  • @vks : 看看这个 (regex101.com/r/gT6kI4/8) 它应该在 x's 处拆分,我们需要一个可变长度的后视。
【解决方案2】:

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

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

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

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

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

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

有一个警告:如果第一部分是第一个空格并且是第 20 个字符,则第一部分可能包含尾随空格。你可以通过做一个小的改变来防止这种情况发生:

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

Demo on ideone

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 如果第一个字符串>20个字符但总字符串中有两个空格,这将返回第一个>20个字符的字符串。 MR SUPERDUPERLONGNAMESMITH BROOKLYN 将返回第一个字符串太长。您错过了“以先到者为准”部分。
    猜你喜欢
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2023-04-04
    • 2020-03-06
    • 2014-06-10
    • 1970-01-01
    相关资源
    最近更新 更多