代码之家  ›  专栏  ›  技术社区  ›  cweston Given

regex-组值替换

  •  2
  • cweston Given  · 技术社区  · 14 年前

    我不确定是否可以这样做,但我需要一种方法,在匹配完成后,用运行时动态声明的字符串替换在正则表达式中指定的编号组的值。

    举个简单的例子,比如…

    (/)?([A-Za-z0-9])?(/)?$
    

    我想能够插入一个替换组2。

    我目前正在使用Java的Matter类。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Community Dunja Lalic    7 年前

    是的,这是可行的。看看我的答案 this question 看看如何。事实上,这个问题可能应该作为一个副本关闭。

    你需要稍微改变一下正则表达式。我不能确切地告诉你想做什么,所以我不能给出任何细节,但至少你应该在小组内移动所有这些问号。

    (/)?([A-Za-z0-9])?(/)?$  // NO
    
    (/?)([A-Za-z0-9]?)(/?)$  // YES
    

    但它仍将匹配目标字符串末尾的空子字符串,因为除了锚之外,所有内容都是可选的, $ . 你真的打算这么做吗?

        2
  •  6
  •   aioobe    14 年前

    我不确定这是否可行…

    是的,这是可能的。请参见下面的示例。

    我想能够插入一个替换组2。

    这个演示“插入”了 .toUpperCase 作为替换的组2的版本。

    import java.util.regex.*;
    
    class Main {
        public static void main(String... args) {
            String input = "hello my name is /aioobe/ and I like /patterns/.";
            Pattern p = Pattern.compile("(/)([A-Za-z0-9]+)(/)");
            Matcher m = p.matcher(input);
            StringBuffer sb = new StringBuffer();
            while (m.find()) {
                String rep = m.group(1) + m.group(2).toUpperCase() + m.group(3);
                m.appendReplacement(sb, rep);
            }
            m.appendTail(sb);
            System.out.println(sb);
        }
    }
    

    印刷品:

    hello my name is /AIOOBE/ and I like /PATTERNS/.
    
        3
  •  0
  •   Valchris    14 年前

    返回regex搜索的值并将其保存到变量中,然后对主字符串进行替换,使用regex搜索结果作为查找目标,动态声明的字符串作为替换。

    真正简化的概念:

    String testString = "Hello there";
    //String substring = *Do your regex work here*
    if(substring.length() > 0) {
       testString.replace(substring, dynamicallyGeneratedString); 
    }