【问题标题】:Regular Expression - Select only one character if it's followed by another char正则表达式 - 如果后面跟着另一个字符,则只选择一个字符
【发布时间】:2012-04-05 14:36:26
【问题描述】:

如果后面没有'#',我想替换字符'&'。例如,在这个字符串 "& hello &# world!" 中,我只想选择第一个 '&'。

到目前为止,我想出了这个正则表达式:

&[^#]

但是,这会选择 2 个字符,而我只想选择 & 字符。

RegExp 大师的任何帮助将不胜感激。


顺便说一句。这可能很重要:我想在 java replaceAll() 中使用它。

非常感谢, 达摩

【问题讨论】:

    标签: java regex


    【解决方案1】:

    使用负前瞻:

    System.out.println("& hello &# world!&".replaceAll("&(?!#)", "&"));
    

    打印:

    & hello &# world!&
    

    【讨论】:

    • 接受,因为这是第一个指向否定前瞻的答案。 +1 对所有其他答案。谢谢大家。
    【解决方案2】:
    String s = "&$ &# &s &";
    String r = s.replaceAll("&([^#])|(&$)", "&$1");
    System.out.println("r = " + r);
    

    打印:

    r = &$ &# &s &
    

    【讨论】:

      【解决方案3】:

      您需要的是negative lookahead。考虑这个简单的代码:

      String str = "& &$ &# &s &#";
      str = str.replaceAll("&(?!#)", "&");
      // assigns: & &$ &# &s &#
      

      这基本上意味着如果后面没有 #,则替换&

      【讨论】:

        【解决方案4】:
        • 您可以将All 替换为@# 或任何其他不可能的字符序列。
        • 用你想要的替换所有 &
        • 并将所有 @# 替换为

        【讨论】:

          【解决方案5】:

          我认为Lookaround 在这里适用:&(?!#)

          【讨论】:

            【解决方案6】:

            你可以使用negative lookahead

            &(?!#)
            

            负前瞻结构是一对圆括号,左括号后跟一个问号和一个感叹号。在前瞻中,我们有一个简单的正则表达式 #。

            【讨论】:

              【解决方案7】:

              你需要做一个look ahead

              虽然没有在java中测试过

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-09-02
                • 1970-01-01
                • 2021-11-15
                • 1970-01-01
                相关资源
                最近更新 更多