正则表达式&作为分隔符

时间:2013-04-26 20:24:42

标签: java regex

我收到一篇长篇文章,其中我需要查找嵌入在&对中的所有文字(例如,在文字"&hello&&bye&"中,我需要找到"hello" {1}}和"bye")。

我尝试使用正则表达式".*&([^&])*&.*"但它不起作用,我不知道这有什么问题。

任何帮助?

由于

6 个答案:

答案 0 :(得分:6)

试试这种方式

String data = "&hello&&bye&";
Matcher m = Pattern.compile("&([^&]*)&").matcher(data);
while (m.find())
    System.out.println(m.group(1));

输出:

hello
bye

答案 1 :(得分:2)

不需要正则表达式。只是迭代!

boolean started = false;
List<String> list;
int startIndex;
for(int i = 0; i < string.length(); ++i){
    if(string.charAt(i) != '&')
        continue;
    if(!started) {
        started = true;
        startIndex = i + 1;
    }
    else {
        list.add(string.substring(startIndex, i)); // maybe some +-1 here in indices
    }
    started = !started;
}

或使用拆分!

String[] parts = string.split("&");
for(int i = 1; i < parts.length; i += 2) { // every second
    list.add(parts[i]);
}

答案 2 :(得分:2)

如果您不想使用正则表达式,这是一个简单的方法。

String string = "xyz...." // the string containing "hello", "bye" etc. 


String[] tokens = string.split("&"); // this will split the string into an array 
                                     // containing tokens separated by "&"

for(int i=0; i<tokens.length; i++)
 {
     String token = tokens[i];


     if(token.length() > 0)
        { 
             // handle edge case
             if(i==tokens.length-1)
             {
                   if(string.charAt(string.length()-1) == '&')
                     System.out.println(token);
             }
             else 
              { 
                System.out.println(token);
              }
        }
 } 

答案 3 :(得分:0)

两个问题:

  1. 您正在重复捕获组。这意味着您只会捕获组中&之间的最后一个字母。

  2. 您只会匹配最后一个单词,因为.*会吞噬字符串的其余部分。

  3. 改为使用lookarounds

    (?<=&)[^&]+(?=&)
    

    现在,当您第二次应用正则表达式时,整个匹配将为hello(和bye)因为周围的&将不再是匹配的一部分:

    List<String> matchList = new ArrayList<String>();
    Pattern regex = Pattern.compile("(?<=&)[^&]+(?=&)");
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        matchList.add(regexMatcher.group());
    } 
    

答案 4 :(得分:0)

周围的.*没有意义,也没有效果。只需&([^&])*&即可。

答案 5 :(得分:0)

我会进一步简化它。

  1. 检查第一个字符是&
  2. 检查最后一个字符是&
  3. String.split("&&")关于它们之间的子串
  4. 在代码中:

    if (string.length < 2)
        throw new IllegalArgumentException(string); // or return[], whatever
    if ( (string.charAt(0) != '&') || (string.charAt(string.length()-1) != '&')
        // handle this, too
    String inner = string.substring(1, string.length()-1);
    return inner.split("&&");