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

use*_*545 2 regex

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

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

\|(\w+)\|
Run Code Online (Sandbox Code Playgroud)

比赛:XS,S

(?=.(\w+)) 
Run Code Online (Sandbox Code Playgroud)

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

Bor*_*der 8

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

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

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

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

(?<=\|)[^|]++(?=\|)
Run Code Online (Sandbox Code Playgroud)
  • (?<=\|) 断言模式背后有一条管道
  • [^|]++ 占有率地匹配所有非管道字符
  • (?=\|) 断言模式后面有一个管道

这是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());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

XS
XL
S
M
Run Code Online (Sandbox Code Playgroud)