【问题标题】:How can I match a delimited sentence that has at least three words and that may contain parts of delimiters?如何匹配至少包含三个单词且可能包含部分分隔符的分隔句子?
【发布时间】:2020-10-24 06:15:18
【问题描述】:

我需要匹配一个两边都用“,”或“::”分隔的字符串。 重要的是要注意句子本身可以包含“,”和“:”,并且我所说的句子是指至少两个单词和一个空格。

例子:

test.wav,,200,,This is a test, or is it?::test 2.wav,,test 3.wav::I said: Do not do that,,error.wav

预期输出:

[
  {
    "groups": [],
    "match": "This is a test, or is it?"
  },
  {
    "groups": [],
    "match": "I said: Do not do that"
  }
]

我试过了:

1.

(?:,,|::)(?:[a-zA-Z0-9\.\-,?!;/\(\)]+\h){2,}.*?(?:,,|::)

但这给了我:

[
  {
    "groups": [],
    "match": ",,200,,This is a test, or is it?::"
  }
]
(?<=,,|::)(?:[a-zA-Z0-9\.\-,?!;/\(\)]+\h){2,}.*?(?:,,|::)

输出:

[
  {
    "groups": [],
    "match": "200,,This is a test, or is it?::"
  },
  {
    "groups": [],
    "match": "test 2.wav,,test 3.wav::"
  }
]

解决这个问题的正确方法是什么?

【问题讨论】:

  • 你能显示你的代码吗?匹配正则表达式如何获得 JSON 输出?
  • 我只是使用 JSON 作为显示输出的手段;这只是 PCRE。

标签: regex pcre


【解决方案1】:

您可以将此正则表达式与前瞻和后视条件一起使用:

(?<=,,|::)\h*(?:(?!\S*(?:,,|::))\S+\h+){3}.*?(?=::|,,)

RegEx Demo

正则表达式详细信息:

  • (?&lt;=,,|::):肯定的后视断言我们在当前位置之前有,,::
  • \h*: 匹配 0+ 个空格
  • (?:: 启动非捕获组
    • (?!\S*(?:,,|::)):否定前瞻断言我们不匹配 ::,, 作为下一个非空白单词的一部分
    • \S+\h+: 匹配 1+ 非空白字符串,后跟 1+ 空白
  • ){3}:结束非捕获组。匹配该组至少 3 次
  • .*?: 匹配 0 个或多个任意字符(非贪心)
  • (?=::|,,):积极的前瞻性断言我们在当前位置之后有 ,,::

【讨论】:

  • 好的,非常感谢。它完美地工作。我只是不想评论,因为它说不要评论只是为了说谢谢等。
【解决方案2】:

您也可以使用一个模式来匹配至少 2 个后跟空格的单词,并为第三个单词至少匹配一个字符,而不必后跟空格。

(?:,,|::)\h*\K(?:(?>[^\s,:]+|,(?!,)|:(?!:))+\h+){2,}(?:(?>[^\s,:]+|,(?!,)|:(?!:)))+(?=\h*(?:,,|::))

说明

  • (?:,,|::)\h*\K 匹配 ,,:: 和可选空格,然后忘记使用 \K 匹配的内容
  • (?:(?&gt;[^\s,:]+|,(?!,)|:(?!:))+\h+){2,} 匹配至少一个不包含 ,,:: 的单个字符的至少 2 个“单词”
  • (?:(?&gt;[^\s,:]+|,(?!,)|:(?!:)))+ 匹配至少一个不包含,,:: 的字符的单词
  • (?=\h*(?:,,|::)) 正向前瞻,断言可选空格后跟,,::

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2012-06-23
    • 1970-01-01
    相关资源
    最近更新 更多