私はJavaでプログラムを作成しており、正規表現を使用してわずかな問題に遭遇しました。私は引用符で囲まれていないものすべてを取得したい。私は正規表現のパターンがright hereですが、問題はJavaで使用できないということです。それは(*SKIP)(*F)
トリックを使用して".*"
をスキップし、他のものを見つける([^\W]
を使用)が、私が言ったように、それはJavaでは使用できません。私は近いパターンですが、必要なものではありません。right here。それは、それの前または後ろに直接引用符を持たないすべてを見つけるでしょう。その問題は、もし私がこのようなものを持っているならば:Test1 "Hello World!" Test2
、そしてTest1
、Test2
、そしてWorld
をつかむでしょう。引用符で囲まれているので、私はWorld
を得たくありません。私が知りたいことは、私が望むことをすることさえ可能であるかどうか、そしてもしそうなら、そうです。単純なJava Regex(* SKIP)(* F)の代替はありますか?
答えて
これらの動詞は、正規表現エンジン(この場合はPCRE)にそれらの一致を破棄するよう伝えるのに非常に便利な方法です。
Javaはこれらの動詞を持っていませんが、あなたは動詞(*SKIP)(*F)
せずにJavaを同じアプローチを使用することができ、あなたが使用できるように、その後...あなたが望むコンテンツをキャプチャ:
".*"|([^\W]+)
or
".*"|(\w+)
そしてつかみます捕捉グループからのコンテンツは、1
String text = "test1 \"hello world!\" test2";
Pattern ptrn = Pattern.compile("\".*\"|([^\\W]+)");
Matcher m = ptrn.matcher(text);
while (m.find()) {
if (m.group(1) != null) {
System.out.println("Text: "+m.group(1));
}
}
でありますよくあなたが捕獲されていないすべてのパターンを破棄し、あなたが持っている場合は、例えば、キャプチャしたいものに集中することができ廃棄技術、として知られている:
".*"|'.*'|`.*`|([^\W]+)
これはすべて一致しますパターンが、conly最後の1
さて、私がやっているやり方は、https://ideone.com/4BdyeBのようなもので、出力に基づいて動作しません。回避策はありますか? – mttprvst13
@ mttprvst13あなたは捕獲グループからコンテンツを取得しなければなりません。それはトリックである 'm.group(1)'を使ってください。私の答えでは、IDEOneのデモが動作することを確認することができます –
をキャプチャしますあなたが欲しいものを抽出するために、キャプチャグループを避け、使用することを希望する内容と一致する必要があります(私は他の方法があるとは思わない) 。これを行うのに便利なパターンは次のとおりです。
(?:[^\w"]+|"[^"]*")*+(\w+)
各マッチでキャプチャグループ1の結果を返します。 demo
注:交換のためのパターンを使用したい場合は、キャプチャグループの最初の部分をあまりにも入れて、このグループを参照して、置換文字列を開始します。
((?:[^\w"]+|"[^"]*")*+)(\w+)
他の方法、スプリットあなたが引用された部品や最終的な行方不明の終了引用符内のエスケープ引用符を処理するために"[^"]*"
"[^"\\]*+(?s:\\.[^"\\]*)*+"?
に変更することができます(?:[^\w"]+|"[^"]*")+
:とあなたの文字列。
残念ながら私はまだ他の投稿にはコメントできませんが、複数の引用符があるとFederico Piazzaのソリューションは失敗します。それは代わりにパターン
Pattern ptrn = Pattern.compile("\".*?\"|([\\w]+)");
?
を使用
test1
test3
を印刷して、完全にTEST2
をスキップするでしょう。この場合
String text = "test1 \"hello world!\" test2 \"foobar\" test3";
:たとえば、あなたのテキストは、次のことをした場合.*
オペレーターは貪欲でなくても検索できます最後の引用ではなく次の引用。基本的に彼の答えをコピーするには、以下のことができます。
String text = "test1 \"hello world!\" test2 \"foobar\" test3";
Pattern ptrn = Pattern.compile("\".*?\"|([\\w]+)");
Matcher m = ptrn.matcher(text);
while (m.find()) {
if (m.group(1) != null) {
System.out.println("Text: "+m.group(1));
}
}
欲張り対非貪欲編集の良いキャッチ。それは私の意味を完全に変えた不幸なタイプミスでした。 – gottfred
あなたは、末尾のスペースを除くと引用符の外の言葉たい:
[^"\s]++((?=\s*"[^\s])|(?=\s*$)|(?=[^"]+\s+"))
場合、それが失敗した:オープニング引用符の前にスペースはありません
- を。
- 引用符の前にスペースがあります。
- 入力内にネストされた引用符または不要な引用符があります。
したがって、OPの通常の入力でのみ定期的に動作します。
ちょうど、 '(?<= \ b)'は '(?= \ b)'と同じですが '\ b'と同じです。 –
あなたは良い点を出しましたが、それはまったく必要ではありません。私はそれを削除した。 @AlanMoore – revo
- 1. Javaでこの単純なロジックを実行する代替/より良い方法はありますか?
- 2. Java用の単純なhttp応答パーサーはありますか?
- 3. 単純なCLI Javaリンターはありますか?
- 4. JSONのより単純な代替方法
- 5. Java上のCanvasRenderingContext2Dの代替手段はありますか?
- 6. JavaのRedDwarfネットワーキングソリューションの.NET代替手段はありますか?
- 7. 最近のpytestの代わりに単純な "assert"がありますか?
- 8. それは(代替f、Foldable f)=> Monad fですか?
- 9. pythonでsmoothScatter(R)の簡単な代替手段はありますか?
- 10. require.jsの代替手段はありますか?
- 11. 単純な文法を解析するJavaライブラリはありますか?
- 12. 単純なWebアプリケーションのSQL Serverの代替
- 13. TemplateControl.ParseControlより高速な代替手段はありますか?
- 14. ioutil.ReadFileより高速な代替手段はありますか?
- 15. C++の単純なGStreamerの例はありますか?
- 16. Delphi用の単純なテキスト差分ユニットはありますか?
- 17. 高水準の単純なIPCライブラリはありますか?
- 18. 単純なNodejs/Mongooseアプリケーションの例はありますか?
- 19. ラップアラウンドマップの単純な「ポイントイン・イン」アルゴリズムはありますか?
- 20. この単純なjqueryには何がありますか?
- 21. F#のBigIntegerにPowの代わりがありますか?
- 22. java runcukesに--guessの代替手段はありません
- 23. MYSQL Regex Negative Lookaheadの代替
- 24. 私の数学に問題がありますか?非常に単純なJava
- 25. ReplayDIRECTOR/Chronon Debuggerのオープンソースの代替品はありますか?
- 26. Webminファイルマネージャの代替品はありますか?
- 27. Android用HTMLUnitの代替ツールはありますか?
- 28. PHPには単純なソートがありますか?
- 29. 単純なファイルは、Java
- 30. Android用CachingHttpClientの代替手段はありますか?
引用符について確信があるならば、この正規表現 '[^"] ++((?= "(?<= \ b))| \ s * $)'がそれを行います。 [デモ](https://regex101.com/r/rX4aY1/1) – revo
@revo事は、それはスペースをつかむことです。 '[^ \ W]'(私はそれを理解することはできません:P) – mttprvst13
私は答えを追加しますように、スペースを取得する方法はありますか? – revo