我想在以下字符串中提取/匹配子串/大小“| XS | XL | S | M |”使用正则表达式。在这种特殊情况下,XS,XL,S和M.
我尝试了以下正则表达式但没有成功。
\|(\w+)\|
匹配:XS,S
(?=.(\w+))
匹配:XS,S,XL,L,S,M
答案 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("\\|");