4

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

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

\|(\w+)\|

搭配:XS、S

(?=.(\w+)) 

搭配:XS、S、XL、L、S、M

4

3 回答 3

11

第一场比赛的问题是消耗了管道,所以下一场比赛他们不在那里。

第二种模式有点令人费解,但您所说的是字符串中的每个字符都抓取它后面的所有单词字符,而不消耗它们。因此,在第一个管道处XS,引擎将移动到X答案所在的位置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());
    }
}

输出:

XS
XL
S
M
于 2013-06-15T12:24:02.150 回答
3

这应该适合你:([^|]+)。它意味着除了管道之外的一切。

于 2013-06-15T12:14:47.913 回答
2

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

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

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

String[] sizes = str.replaceAll("(^\\|)|(\\|$)", "").split("\\|");
于 2013-06-15T12:38:24.660 回答