2012-07-12 76 views
0

我使用Java Pattern类将正则表达式指定为字符串。正则表达式保留引号,单引号,连字符和空格分隔

所以例如 我喜欢蜘蛛侠“彼得·帕克”

应该列出蜘蛛侠“彼得·帕克”作为一个单独的令牌。 感谢

try { 
    BufferedReader br = new BufferedReader(new FileReader(f)); 
    StringBuilder sb = new StringBuilder(); 
    String line = br.readLine(); 

    while (line != null) { 
     sb.append(line); 
     line = br.readLine(); 
    } 

    String everything = sb.toString();   
    List<String> result = new ArrayList<String>(); 
    Pattern pat = Pattern.compile("([\"'].*?[\"']|[^ ]+)"); 
    PatternTokenizer pt = new PatternTokenizer(new StringReader(everything),pat,0); 
    while (pt.incrementToken()) { 
    result.add(pt.getAttribute(CharTermAttribute.class).toString()); 

    } 

} 
    catch (Exception e) { 
    throw new RuntimeException(e); 
    } 

,所以我想为什么“一些词”是行不通的,因为每个令牌本身就是一个字符串的原因。 任何线索?谢谢

+0

您是否尝试过使用的StringTokenizer? – Sujay 2012-07-12 00:26:08

+0

不,我读到在SO本身上使用它不是一个好习惯。所以我想使用一个Lucene API的patterntokenizer类,它需要一个正则表达式来将字符串拆分为令牌。 – YuNo 2012-07-12 00:30:11

+0

我不认为你可以使用'split()'或类似的东西来处理这种情况。 – nhahtdh 2012-07-12 00:42:11

回答

1

检查这个表达式是否是你所需要的:

"([\"'].*?[\"']|(?<=[ :]|^)[a-zA-Z0-9-]+(?=[ :]|$))" 

我认为你没有(单/双)引号内(单/双)引号。

还有关于分隔符的假设:我只允许空格和:作为分隔符。 "foo_bar"什么都不会匹​​配。如果你想添加更多的分隔符,如;.,?,将其添加到字符类中都提前看看,看看后面断言,这样的:

"([\"'].*?[\"']|(?<=[ :;.,?]|^)[a-zA-Z0-9-]+(?=[ :;.,?]|$))" 

在每个输入尚未进行测试,但我已经测试了这个输入:

" sdfsdf \" sdfs sdfsdfs \" \"sdfsdf\" sdfsdf sdfsd dsfshj sdfsdf-sdf 'sdfsdfsdf sd f ' " 
// I used replaceAll to check the captured group 
.replaceAll("([\"'].*?[\"']|(?<=[ :]|^)[a-zA-Z0-9-]+(?=[ :]|$))", "X$1Y") 

它对我来说很好。

如果你想有一个更自由的拍摄,但仍与有关引用的假设:

"([\"'].*?[\"']|[^ ]+)" 

要提取的比赛:

Matcher m = Pattern.compile(regex).matcher(inputString); 
List<String> tokens = new ArrayList<String>(); 
while (m.find()) { 
    tokens.add(m.group(1)); 
} 
+0

谢谢你的回答。假设它是用于分割一个字符串,这是行不通的。它返回很多空的标记。 – YuNo 2012-07-12 00:43:00

+0

即使匹配,只有连字符工作,但报价部分没有。 – YuNo 2012-07-12 00:45:40

+0

@YuNo:你甚至尝试过“提取匹配”部分吗? – nhahtdh 2012-07-12 00:49:04

2

如果它不必须是正则表达式和数据在字符串是正确的(引号是正确的顺序不像" ' some data " '),那么你可以在做一个迭代

String data="I love being spider-man : \"Peter Parker\" or 'photo reporter'"; 

List<String> tokens = new ArrayList<String>(); 
StringBuilder sb=new StringBuilder(); 
boolean inSingleQuote=false; 
boolean indDoubleQuote=false; 

for (char c:data.toCharArray()){ 
    if (c=='\'') inSingleQuote=!inSingleQuote; 
    if (c=='"') indDoubleQuote=!indDoubleQuote; 
    if (c==' ' && !inSingleQuote && !indDoubleQuote){ 
     tokens.add(sb.toString()); 
     sb.delete(0,sb.length()); 
    } 
    else 
     sb.append(c); 
} 
tokens.add(sb.toString()); 
System.out.println(tokens); 

输出

[I, love, being, spider-man, :, "Peter Parker", or, 'photo reporter'] 
+0

感谢您的回答!但是,对不起,它必须是正则表达式。它用于文件标记。 – YuNo 2012-07-12 01:06:11

相关问题