【问题标题】:Regular Expression to match #hashtag but not #hashtag; (with semicolon)正则表达式匹配#hashtag 但不匹配#hashtag; (带分号)
【发布时间】:2016-11-25 04:27:38
【问题描述】:

我有当前的正则表达式:

/(?<=[\s>]|^)#(\w*[A-Za-z_]+\w*)/g

我正在针对字符串进行测试:

Here's a #hashtag and here is #not_a_tag; which should be different. Also testing: Mid#hash. #123 #!@£ and <p>#hash</p>

出于我的目的,在此字符串中应该只检测到两个主题标签。我想知道如何更改表达式,使其匹配以; 结尾的主题标签,在我的示例中这是#not_a_tag;

干杯。

【问题讨论】:

    标签: regex hashtag


    【解决方案1】:

    以下内容如何:

    \B(\#[a-zA-Z]+\b)(?!;)
    

    Regex Demo

    • \B -> 不是单词边界
    • (#[a-zA-Z]+\b) -> 捕获以 # 开头的组,后跟任意数量的 a-z 或 A-Z,最后有一个单词边界
    • (?!;) -> 后面没有;

    【讨论】:

    • 您的意思是\B\W 需要在 # 之前出现一个实际字符。
    • 接受最少步骤的答案。 \B 可能是我将要使用的。
    • 它与 #007 和 #50cents 不匹配,它们是真正的主题标签。
    • 是否支持非英语语言?
    【解决方案2】:

    您可以使用负前瞻正则表达式:

    /(?<=[\s>]|^)#(\w*[A-Za-z_]+\w*)\b(?!;)/
    
    • \b - 词边界确保我们在词尾
    • (?!;) - 断言我们在下一个位置没有分号

    RegEx Demo

    【讨论】:

    • 对于性能\B#(\d*[A-Za-z_]+\w*)\b(?!;) 应该是您的正则表达式。 #[a-zA-Z]+ 不会匹配 #123hashtag
    • 另外,Safari 不支持“查看正则表达式”。
    • 是的,没错,虽然它从来都不是兼容 Safari 的
    【解决方案3】:

    这是最佳做法。

    (#+[a-zA-Z0-9(_)]{1,})
    

    【讨论】:

    • 最佳答案在这里,谢谢。如果您的软件将是国际化的,则唯一可能需要的修改是允许 åççéñts。也许像(#+[a-zA-Z0-9A-Za-zÀ-ÖØ-öø-ʸ(_)]{1,})
    【解决方案4】:
    /(#(?:[^\x00-\x7F]|\w)+)/g
    

    以 # 开头,然后是至少一个 (+) ANCII 符号([^\x00-\x7F],范围不包括非 ANCII 符号)或单词符号 (\w)。

    这应该涵盖包括“#їжак”之类的 ANCII 符号在内的情况。

    【讨论】:

      【解决方案5】:

      类似于 anubhava 的答案,但将 \w* 的 2 个实例与 \d* 交换,因为 \w[A-Za-z_] 之间的唯一区别是 0-9 字符

      这具有将步数从 588 减少到 90 的效果

      (?&lt;=[\s&gt;])#(\d*[A-Za-z_]+\d*)\b(?!;)

      Regex101 demo

      【讨论】:

        【解决方案6】:
        (?<=(\s|^))#[^\s\!\@\#\$\%\^\&\*\(\)]+(?=(\s|$))
        

        匹配任何主题标签的正则表达式代码。

        在这种方法中,除了主要标志!@#$%^&amp;*()之外,主题标签中的任何字符都可以接受

        使用说明

        使用时开启“g”和“m”标志!

        它通过https://regex101.com 和 VSCode 工具针对 Java 和 JavaScript 语言进行了测试。

        this repo 上可用。

        【讨论】:

        • 不要认为你的答案是在回答 OP 问题:regex101.com/r/FFvPfn/1 OP 不想匹配分号。对于未来,最好直接分享 regex101 demo/sn-p 而不是仅仅链接到登录页面。
        【解决方案7】:

        你可以试试这个模式:/#\S+/

        它将包括# 之后的所有字符,除了空格。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-06
          相关资源
          最近更新 更多