【问题标题】:How to select a specific character in regex if it match certain conditions如果匹配某些条件,如何在正则表达式中选择特定字符
【发布时间】:2021-04-26 13:26:44
【问题描述】:

我正在尝试从字符串中找到一个破折号-,如果它符合某些条件并且只有破折号应该由正则表达式选择。

应该选择的情况-

  1. 如果两边都有空间。示例:test - dash
  2. 如果右侧有空间。示例:test- dash
  3. 如果两边都没有空间。示例:test-dash

不应该选择的情况

  1. 如果右侧没有空间,但左侧有空间。示例:test -dash

这是我的进度

如屏幕截图所示,我可以使用positive-lookbehind 实现,但这并未得到广泛支持。

那么,我的问题是,有没有其他方法可以在不使用positive-lookbehind 的情况下实现这一目标?

谢谢。

【问题讨论】:

  • 我处理的许多正则表达式引擎中的大多数都具有此功能。你是如何得出它没有得到广泛支持的结论的?
  • @BingWang 我查看了 caniuse,它说 IE11 和 safari 不支持它,不幸的是,我的应用程序针对 IE 11

标签: regex regex-lookarounds lookbehind regex-look-ahead


【解决方案1】:

对于示例数据,如果您不能使用lookbehind,也许使用单词边界就足够了。

-(?=\s)|\b-(?=[^\s-])

说明

  • -(?=\s) 匹配 - 并在右侧声明一个空白字符
  • |或者
  • \b-(?=[^\s-]) 字边界,匹配 - 并在右侧断言除 - 之外的非空白字符

Regex demo

【讨论】:

    【解决方案2】:

    这应该可行:

    \S+( ?)-(\1| )\S+
    

    https://regex101.com/r/XI6W4R/1

    它使用第一个捕获组来知道破折号之前是否有空格。如果有,则破折号后必须有一个空格。否则,破折号后的空格是可选的。

    反向引用比正向回溯得到更广泛的支持(根据Regular Expression Engine Comparison Chart)。


    我试图只选择 -。而不是整件事

    在这种情况下,我的知识仅限于提供以下正则表达式的使用

    \S+( ?)(-)(\1| )\S+
    

    并使用捕获组 2 来查找破折号。如果不知道这个正则表达式的确切使用方式,也很难提供更好的建议。

    https://regex101.com/r/XI6W4R/2

    【讨论】:

    • 感谢您的帮助。它部分有效,因为我试图只选择-。而不是整个事情
    • @Jamen 道歉我没有完全阅读这个问题。我不确定此方法是否只能选择破折号,因为它依赖于之前捕获字符的值。如果将破折号捕获在您可以使用的组中,它会起作用吗?点赞...(-)...,然后使用捕获组 2 定位破折号。
    • @Jamen 事实上,我想得越多,我就越相信在没有环视的情况下评估周围的字符时,即使使用\K 之类的技巧。我绝不是专家,所以我很高兴错了。我会说尝试使用捕获组来匹配破折号并从那里开始(请参阅我的编辑)。
    • 正确。我只能通过lookbehind 技巧来实现这一点,但不幸的是,我的应用所针对的浏览器之一不支持此功能。事实上,我不必只选择-,我只是好奇是否有办法在没有lookbehind 的情况下做到这一点。无论如何,再次感谢您的帮助。
    【解决方案3】:

    你可以使用

    -(?!(?<=\s-)\S)
    

    请参阅regex demo

    详情

    • - - 一个连字符
    • (?!(?&lt;=\s-)\S) - 后面不紧跟非空白字符(即右侧必须有一个空格或字符串结尾),也就是说,紧跟在前面紧跟一个空白和 - 字符.

    【讨论】:

    • 这里的积极后视不违反 OP 的标准吗?
    • 没有其他可靠的方法,除非 OP 解释他们正在编码的内容和位置以及他们想要实现的目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多