4

テキストを分割し、単語、数字、およびハイフンでつながれた構成単語のみを取得する必要があります。ラテン語も取得する必要があるため、\p{L}é、ú ü ã などを取得する を使用しました。例は次のとおりです。

String myText = "Some latin text with symbols, ? 987 (A la pointe sud-est de l'île se dresse la cathédrale Notre-Dame qui fut lors de son achèvement en 1330 l'une des plus grandes cathédrales d'occident) : ! @ # $ % ^& * ( ) + - _ #$% "  ' : ; > < / \  | ,  here some is wrong… * + () e -"

Pattern pattern = Pattern.compile("[^\\p{L}+(\\-\\p{L}+)*\\d]+");
String words[] = pattern.split( myText );

この正規表現の何が問題になっていますか? "(""+""-""*"などの記号に一致するのはなぜ"|"ですか?

結果の一部は次のとおりです。

dresse     // OK
sud-est    // OK
occident)  // WRONG
987        // OK
()         // WRONG
(a         // WRONG
*          // WRONG
-          // WRONG
+          // WRONG
(          // WRONG
|          // WRONG

正規表現の説明は次のとおりです。

[^\p{L}+(\-\p{L}+)*\d]+

 * Word separator will be:
 *     [^  ...  ]  No sequence in:
 *     \p{L}+        Any latin letter
 *     (\-\p{L}+)*   Optionally hyphenated
 *     \d            or numbers
 *     [ ... ]+      once or more.
4

3 に答える 3

3

あなたの要件についての私の理解が正しければ、この正規表現はあなたが望むものと一致します:

"\\p{IsLatin}+(?:-\\p{IsLatin}+)*|\\d+"

一致します:

  • Unicodeラテン文字の連続したシーケンス。どの\p{L}スクリプトでも文字と一致するため、ラテン文字に制限します。ご使用のバージョンのJavaが構文をサポートしていない場合に変更します。\\p{IsLatin}\\pL
  • または、ハイフンでつながれたいくつかのそのようなシーケンス
  • または、連続する10進数のシーケンス(0〜9)

上記の正規表現は、を呼び出して使用しPattern.compile、を呼び出してオブジェクトmatcher(String input)を取得しMatcher、ループを使用して一致するものを検索します。

Pattern pattern = Pattern.compile("\\p{IsLatin}+(?:-\\p{IsLatin}+)*|\\d+");
Matcher matcher = pattern.matcher(inputString);

while (matcher.find()) {
    System.out.println(matcher.group());
}

アポストロフィ付きの単語を許可する場合'

"\\p{IsLatin}+(?:['\\-]\\p{IsLatin}+)*|\\d+"

さらに追加したい場合に備えて-、キャラクタークラスでもエスケープします。['\\-]キャラクタークラスの最初か最後かは実際-にはエスケープする必要はありませんが、念のためとにかくエスケープします。

于 2013-02-12T13:01:47.707 に答える
2

文字クラスの左角かっこの後に a が続く場合、^クラス内にリストされている文字は使用できません。したがって、正規表現では、1回以上発生するUnicode 文字、、、、、および数字以外はすべて許可されます。+(-)*

+(、などの文字は、文字クラス内では特別な意味を持たないこと)に注意してください。*

pattern.split が行うことは、正規表現に一致するパターンで文字列を分割することです。正規表現は空白と一致するため、1 つ以上の空白が出現するたびに分割が発生します。というわけで結果はこうなります。

たとえば、これを考えてみましょう

Pattern pattern = Pattern.compile("a");
    for (String s : pattern.split("sda  a  f  g")) {
        System.out.println("==>"+s);
    }

出力は

==>sd

==>

==> fg

于 2013-02-12T13:06:05.193 に答える
0

の正規表現セットの説明に[]は、文字、クラス(\p{...})、シーケンス(eg a-z)、および補数記号(^)のみを含めることができます。使用している他の魔法のキャラクター(+*())をブロックのに配置する必要があります。[ ]

于 2013-02-12T13:01:54.503 に答える