0

Java パターン クラスを使用して、正規表現を文字列として指定します。

たとえば、私はスパイダーマンになるのが大好きです: 「ピーター・パーカー」

Spider-man と "Peter Parker" を別のトークンとしてリストする必要があります。ありがとう

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);
   }

したがって、「何らかの単語」が機能しない理由は、各トークン自体が文字列であるためだと思います。手がかりはありますか?ありがとうございました

4

2 に答える 2

2

正規表現である必要がなく、文字列のデータが正しい場合(引用符は正しい順序であるのとは異なります)、次のように1回の繰り返し" ' 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']
于 2012-07-12T00:43:31.817 に答える
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));
}
于 2012-07-12T00:32:26.500 に答える