4

テキスト行を単語に分割する必要があり、使用する正規表現について混乱しています。私はどこでも単語に一致する正規表現を探し、この投稿に似た正規表現を見つけましたが、Javaでそれを望んでいます(Javaは通常の文字列で\を処理しません)。

単語とアポストロフィ付きの単語を照合する正規表現

私は各回答に対して正規表現を試しましたが、これのために Java の正規表現を構築する方法がわかりません (すべての正規表現が同じであると仮定しました)。私が見る正規表現で \ を \ に置き換えると、正規表現は機能しません。

私も自分で調べてみましたが、このページに来ました: http://www.regular-expressions.info/reference.html

しかし、正規表現の高度なテクニックに頭を悩ませることはできません。

String.split(ここでは正規表現文字列) を使用して文字列を分離しています。たとえば、「私は食べるのが好きですが、みんなの食べ物を食べるのは好きではありません。そうしないと、彼らは飢えてしまいます。」一致させたい:

I
like
to
eat
but
I
don't
like
to
eat
everyone's
food
or
they'll
starve

また、'' または '''' または ' ' または '.'' またはその他の順列に一致させたくありません。私のデリミタ条件は次のようにする必要があります:[任意の単語文字に一致][単語文字が前にある場合はアポストロフィにも一致し、その後に単語文字がある場合は一致します]

私が得たのは単語 [\w] に一致する単純な正規表現ですが、先読みまたは後読みを使用してアポストロフィと残りの単語を一致させる方法がわかりません。

4

2 に答える 2

4

私のコメントに記載されているページの回答を使用WhirlWindすると、次のことができます。

String candidate = "I \n"+
    "like \n"+
    "to "+
    "eat "+
    "but "+
    "I "+
    "don't "+
    "like "+
    "to "+
    "eat "+
    "everyone's "+
    "food "+
    "''  ''''  '.' ' "+
    "or "+
    "they'll "+
    "starv'e'";

String regex = "('\\w+)|(\\w+'\\w+)|(\\w+')|(\\w+)";
Matcher matcher = Pattern.compile(regex).matcher(candidate);
while (matcher.find()) {
  System.out.println("> matched: `" + matcher.group() + "`");
}

それは印刷されます:

> matched: `I`
> matched: `like`
> matched: `to`
> matched: `eat`
> matched: `but`
> matched: `I`
> matched: `don't`
> matched: `like`
> matched: `to`
> matched: `eat`
> matched: `everyone's`
> matched: `food`
> matched: `or`
> matched: `they'll`
> matched: `starv'e`

ここで実行例を見つけることができます: http://ideone.com/pVOmSK

于 2012-11-29T19:26:42.447 に答える
0

次の正規表現は、サンプル文字列を正しくカバーしているようです。ただし、アポストロフィのシナリオはカバーされていません。

[\s,.?!"]+

Java コード:

String input = "I like to eat but I don't like to eat everyone's food, or they'll starve.";
String[] inputWords = input.split("[\\s,.?!]+");

私の理解が正しければ、アポストロフィは、単語の文字の後にある限り、そのままにしておく必要があります。この次の正規表現は、上記に加えて、アポストロフィの特殊なケースをカバーする必要があります。

(?<!\w)'|[\s,.?"!][\s,.?"'!]*

Java コード:

String input = "I like to eat but I don't like to eat everyone's food, or they'll starve.";
String[] inputWords = input.split("(?<!\\w)'|[\\s,.?\"!][\\s,.?\"'!]*");

文字列に対して 2 番目の正規表現を実行するとHey there! Don't eat 'the mystery meat'. 、次の単語が文字列配列に含まれます。

Hey
there
Don't
eat
the
mystery
meat'
于 2012-12-02T02:08:42.263 に答える