【问题标题】:Regex for selecting upto char before char 'x' before char 'y'用于在 char 'x' 之前选择 upto char before char 'y' 的正则表达式
【发布时间】:2019-08-22 15:57:37
【问题描述】:

想要从firstthe char before 'x' before 'y' 中选择文本。
需要先查找'y',然后向后查找'x' 的第一次出现(或查找中的最后一个'x'),然后选择'x' 之前的位置。

示例:(输入 -> 输出)

abxabxaby -> abxab 

(直到第一次出现yabxabxaby。然后直到第一个向后的x(或查找中的最后一个x)是abxabx,在x 之前是abxab

12xabcyabcxay -> 12

(直到第一次出现y12xabcy,然后第一次出现x12x 和之前x12

abcxy -> abc

(同样的规则。abcxy,然后是abcx 所以abc

abcx -> (No match, as no y)
abcy -> (No match, as no x)
abcyx -> (No match, not in correct order)

【问题讨论】:

  • 要求正则表达式与要求某人为您编写一些代码非常相似。请展示您的研究结果和您自己的代码,我们很乐意帮助您指明正确的方向。

标签: java regex regex-negation


【解决方案1】:

你可以使用这个正则表达式:

^[^y]*(?=x)

它会贪婪地找到所有不是y 的东西,直到它看到x。 “所有不是y”部分确保它找到字符串中的第一个y。 “贪婪”部分确保它在第一个 y 之前找到 last x

但是,如果字符串没有y,这将不起作用。所以你需要单独检查,只需使用contains("y")

【讨论】:

  • 为什么不直接使用lookbehind?
  • @Michael 你能解释一下你的意思吗?另外,如果您有解决方案,为什么不将其作为答案发布?
  • 谢谢@Sweeper。到目前为止,不可能不是'y',所以这会很好,但如果我找到更具体的解决方案,我会更新。 :)
【解决方案2】:

试试正则表达式:^(?=.*y)([^y]*)(?=x(?=[^x]*y))

Demo

请注意,这也将满足abcx -> (No match, as no y)的要求

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2021-06-06
    • 2022-11-11
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多