我想提取/匹配以下字符串“|XS|XL|S|M|”中的子字符串/大小 使用正则表达式。在这种特殊情况下,XS、XL、S 和 M。
我尝试了以下正则表达式但没有成功。
\|(\w+)\|
搭配:XS、S
(?=.(\w+))
搭配:XS、S、XL、L、S、M
我想提取/匹配以下字符串“|XS|XL|S|M|”中的子字符串/大小 使用正则表达式。在这种特殊情况下,XS、XL、S 和 M。
我尝试了以下正则表达式但没有成功。
\|(\w+)\|
搭配:XS、S
(?=.(\w+))
搭配:XS、S、XL、L、S、M
第一场比赛的问题是消耗了管道,所以下一场比赛他们不在那里。
第二种模式有点令人费解,但您所说的是字符串中的每个字符都抓取它后面的所有单词字符,而不消耗它们。因此,在第一个管道处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
这应该适合你:([^|]+)
。它意味着除了管道之外的一切。
您正在消耗管道。相反,使用环顾四周:
(?<=\|).*?(?=\|)
要拆分字符串,请在修剪前导/尾随管道后使用管道作为分隔符。
在java中,要在一行中完成:
String[] sizes = str.replaceAll("(^\\|)|(\\|$)", "").split("\\|");