1

正規表現の世界についての理解が不十分であることをお詫びします。正規表現を使用してテキストを分割しようとしています。これが私が今していることです。次の文字列を考慮してください


String input = "Name:\"John Adam\"  languge:\"english\"  Date:\" August 2011\"";
Pattern pattern = Pattern.compile(".*?\\:\\\".*?\\\"\\s*");
Matcher matcher = pattern.matcher(input);
List keyValues = new LinkedList();
while(matcher.find()){
   System.out.println(matcher.group());
   keyValues.add(matcher.group());
}
System.out.println(keyValues);

私が探しているのは正しい出力です。


Name:"John Adam"  
languge:"english"  
Date:" August 2011"

今、私はそれを少し一般的なものにするのに苦労しています。たとえば、入力文字列に別のパターンを追加した場合です。新しい値Audience:(user)を別のパターンで追加しました。つまり、 "は()に置き換えられます。


String input = "Name:\"John Adam\"  languge:\"english\"  Date:\" August 2011\"  Audience:(user)";

このための一般的なパターンは何でしょうか?これがあまりにも足りないように聞こえたらごめんなさい。

ありがとう

4

3 に答える 3

2

ステップ1:これらのbaskslashesのほとんどを削除します-引用符やコロンをエスケープする必要はありません(これらは単なる別の通常の文字です)

このパターンを試してください:

".*?:[^\\w ].*?[^\\w ]\\s*"

区切り文字であるすべての非単語/スペース文字に対して機能し、テストケースに対して機能し、などに対して機能しますname:'foo'

于 2012-06-01T19:44:17.900 に答える
1

いつでもOR演算子を使用できます|

Pattern pattern = Pattern.compile("(.*?\\:\\\".*?\\\"\\s*)|(.*?\\:\\(.*?\\)\\s*)");
于 2012-06-01T19:16:09.890 に答える
1

まず、正規表現は特効薬ではないことを指摘しておく必要があります。つまり、非常に柔軟で便利な場合もありますが、テキストマッチングのすべての問題を解決できるわけではありません(たとえば、XMLのようなマークアップの解析)。

ただし、指定した例では、|構文を使用して、一致する代替パターンを指定できます。例は次のとおりです。

Pattern pattern = Pattern.compile(".*?\\:(\\\".*?\\\"|\\(.*?\\))\\s*");

括弧内のこのセクションは、次(\\\".*?\\\"|\\(.*?\\))のように考えることができます。\\\".*?\\\"またはに一致するパターンを見つけます\\(.*?\\)(バックスラッシュの意味を覚えておいてください。これらはエスケープ文字です。

ただし、このアプローチは柔軟性がありますが、特定のケースを文字通り追加する必要があるため、絶対的な意味で真に一般的ではないことに注意してください。

ノート

真に一般的なソリューションを作成できないことの意味をわかりやすく説明するために、使用できるより一般的なパターンを次に示します。

Pattern pattern = Pattern.compile(".*?\\:[\\\"(]{1,2}.*?[\\\")]{1,2}\\s*");

上記のパターンは文字クラスを使用しており、より一般的ですが、例と一致しますが、次のようなblah:\stuff\ものにblah:"stuff"も一致します。 blah:\"stuff)blah:((stuff""

于 2012-06-01T19:16:19.220 に答える