2016-08-02 52 views
1

我有一个字符串和所需的正则表达式来从字符串中提取的子字符串。正则表达式来提取文本含有管charcters

实施例:this is a|b|c|d whatever e|f|g|h
结果:a|b|c|d, e|f|g|h

但是基于我写,则产生的结果如下Java代码:

Pattern ptyy = Pattern.compile("\\|*.+? "); 
Matcher matcher_values = ptyy.matcher("this is a|b|c|d whatever e|f|g|h"); 
while (matcher_values.find()) { 
    String line = matcher_values.group(0); 
    System.out.println(line); 
} 

结果

this 
is 
a|b|c|d 
whatever 

结果不是我所希望的河有什么建议?

+2

尝试['/[^\s|]+(?:\|[^\s|])++g'](https://regex101.com/r/aL9bL4/1) –

+0

您是否只有想要单个字母?还是应该'foo | bar | baz | qux'匹配?而且,它总是正好4项,还是应该匹配?a | b | c? – Bohemian

+0

我也想匹配foo | bar | baz | qux,foo2 | ba2r | baz | qux5以及 –

回答

1

\|*.+?模式匹配0或更多的管道,然后1个或多个任意字符比换行到第一空间的其他。因此,它可以匹配字符串中的几乎所有非空白块。

如果abc只是占位符,并且可以有任何非空白字符,我建议:

[^\s|]+(?:\|[^\s|])+ 

regex demo

详细

  • [^\s|]+ - 1以上字符比空白和等和除空白,1个或多个字符|

Java demo

  • \| - - 字面|
  • [^\s|]

    -个
  • (?:\|[^\s|])+的1或多个序列
    Pattern ptyy = Pattern.compile("[^\\s|]+(?:\\|[^\\s|])+"); 
    Matcher matcher_values = ptyy.matcher("this is a|b|c|d whatever e|f|g|h"); 
    while (matcher_values.find()) { 
        String line = matcher_values.group(0); 
        System.out.println(line); 
    } 
    
2

我想这正则表达式是不够(.\|)+.

看到example

(.\|)此找到所有的a|b|...|和最后.找到子字符串的最后一个字符。

0

根据你的建议,我设法拿出我自己的正则表达式,可以解决管道表达的不同组合。

Pattern ptyy = Pattern.compile("[^\\s|]+(?:\\|[^\\s|])+"); 
Matcher matcher_values = ptyy.matcher("this is a|b|c|d whater e|f|g|h and Az|09|23|A3 and 22|1212|12121|55555"); 
while (matcher_values.find()) { 
    String line = matcher_values.group(0); 
    System.out.println(line); 
} 

这将使我能够得到的结果

a|b|c|d 
e|f|g|h 
Az|09|23|A 
22|1212|12121|5 

谢谢大家!

+0

对不起,但它正是*正则表达式* I **在[我的回答](http:// stackoverflow.com/a/38716040/3832970)。如果它适合你,那么发布重复解决方案就没有意义。请考虑删除此信息并接受我的回答。 –