正则表达式,匹配管道之间的子串

时间:2013-06-15 12:11:27

标签: regex

我想在以下字符串中提取/匹配子串/大小“| XS | XL | S | M |”使用正则表达式。在这种特殊情况下,XS,XL,S和M.

我尝试了以下正则表达式但没有成功。

\|(\w+)\|

匹配:XS,S

(?=.(\w+)) 

匹配:XS,S,XL,L,S,M

3 个答案:

答案 0 :(得分:8)

第一场比赛的问题是消耗管道,所以它们不适合下一场比赛。

第二个模式有点复杂,但你所说的是字符串中的每个字符都会抓住它后面的所有单词字符,而不会消耗它们。因此,在XS的第一个管道上,引擎然后移动到答案为X的{​​{1}}。然后引擎移动到模式不匹配的S

您需要使用正面外观,因此您可以在不消耗管道的情况下匹配和使用管道之间的文本。您希望,对于任何单词字符组,断言它在其前后都有一个管道。在这种情况下,您想要使用它。

如果您的语言支持它(您没有提到您正在使用的正则表达式引擎),这种模式将起作用:

S
  • (?<=\|)[^|]++(?=\|) 声称模式后面有一个管道
  • (?<=\|)占有率地匹配所有非管道字符
  • [^|]++声称模式后面有一个管道

这是Java中的一个测试用例(忽略(?=\|),只有Java语法):

\\

输出:

public static void main(String[] args) throws Exception {
    final String test = "|XS|XL|S|M|";
    final Pattern pattern = Pattern.compile("(?<=\\|)[^|]++(?=\\|)");
    final Matcher matcher = pattern.matcher(test);
    while(matcher.find()) {
        System.out.println(matcher.group());
    }
}

答案 1 :(得分:3)

这应该对你有用:([^|]+)。除了管道之外,它意味着一切。

答案 2 :(得分:1)

你正在消耗管道。相反,请使用环顾四周:

(?<=\|).*?(?=\|)

要分割字符串,请在修剪前导/尾随管道后使用管道作为分隔符 在java中,要在一行中执行:

String[] sizes = str.replaceAll("(^\\|)|(\\|$)", "").split("\\|");