【问题标题】:Regex that matches every nth occurences of character匹配每第 n 次出现的字符的正则表达式
【发布时间】:2016-05-05 09:53:41
【问题描述】:

我找到了查找第 n 次出现的解决方案,但找不到找到每第 n 次出现的解决方案。

我有诸如“key1~value1~key2~value2~key3~value3~”之类的字符串。

~ 的每两次出现匹配的正则表达式是什么?

key1~value1~key2~value2~key3~value3~

我正在尝试为 Elasticsearch 创建一个自定义模式分析器,它是正则表达式应该匹配标记分隔符而不是标记。

【问题讨论】:

  • 所以你的匹配是value1 value2 value3?
  • 你只需要([^~]+)~([^~]+)
  • @ʰᵈˑ 不,我的比赛将是第 2、第 4、..~ 字符。 @Wiktor 匹配 key~value 对。我想要的恰恰相反。
  • @alpert:为什么你只需要得到偶数~s? (我以为您想通过在偶数~s 处拆分来获得键值对。)最终结果应该是什么?语言是什么?
  • @Wiktor Stribiżew 我正在尝试为 elasticsearch 创建一个自定义模式分析器,正则表达式应该匹配标记分隔符而不是标记:elastic.co/guide/en/elasticsearch/reference/current/…

标签: regex elasticsearch


【解决方案1】:

你可以使用

~(?=(?:[^~]*~[^~]*~)*[^~]*$)

模式匹配:

  • ~ - 一个波浪号,后跟...
  • (?=(?:[^~]*~[^~]*~)*[^~]*$) - 0+ 非波浪线 + ~ x 2 次,0+ 次,然后是 0+ 非波浪线,直到字符串的末尾。因此,此检查可确保在匹配第一个波浪号后,直到字符串末尾有偶数个波浪号。

【讨论】:

  • 最好是找到一个同样适用于奇数实例的示例,但这也解决了我的问题。谢谢!
【解决方案2】:

你需要确保~之前不是偶数个:

(?<!^([^~]*~[^~]*~)*[^~]*)~

Try it online!


工作原理:

(?<!^([^~]*~[^~]*~)*[^~]*)~    Our regex.
                          ~    Matches a tilde (~).
(?<!                     )     Assert that before it is not:
    ^                              the beginning
     (            )*               followed by zero or more times:
      [^~]*~[^~]*~                     two tildes, no matter what comes within
                    [^~]*          followed by non-tildes.

【讨论】:

  • 这仅适用于 .NET、Vim(使用不同的语法)和 PyPi 正则表达式 Python 模块(和 JGSoft)正则表达式风格。在某种程度上,这种方法适用于 Java。问题是lookbehind中的模式是无限宽度的,大多数支持lookbehind的语言只支持固定宽度的lookbehind版本。
  • 更多风格会支持正向向后看吗?
  • 当我尝试将它与使用 Java 的 elasticsearch 一起使用时,我收到“后视组没有明显的最大长度”错误。有没有更通用的方法也适用于 java?
【解决方案3】:

~.*?(~) 的第一组非重叠出现。试试:http://regexr.com/3dc15

【讨论】:

  • 匹配 ~value~ 对。这不是我想要的。
  • @alpert 第一组匹配~
  • see this answer 了解如何使用这个正则表达式
猜你喜欢
  • 2015-04-10
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多