2 種類の文字を含むテキストから文字列を抽出しようとしています。文字は|
と#
であり、テキストは外部ソースからのものです。
例を挙げます:
- 入力:および
#hello|#what|whatsup|
を返す必要がhello|
ありwhatsup
ます。 - 入力:
#hello#
返す必要がありますhello
- 入力:
|ola|1
返す必要がありますola
- 入力:
|hello#|what#whatsup#node
返す必要がhello#
あり、whatsup
これは文字列で機能します。必要なものを完全に理解したかどうかはわかりませんが、必要に応じて調整できると思います。
String s1 = "#hello|#what|whatsup|";
String s2 = "#hello#";
String s3 = "|ola|1";
String s4 = "|hello#|what#whatsup#node";
Pattern pattern = Pattern.compile("((\\w)+)(\\||#)(\\||#)?");
Matcher matcher = pattern.matcher(s4);
while(matcher.find()) {
System.out.println(matcher.group(1) + (matcher.group(4) != null ? matcher.group(4).equals("|")? "#" : "|" : ""));
matcher.find(); //to jump over the next match
}
更新: middlerecursion の例を読んだところです。残念ながら、それはうまくいきません。しばらくの間、コンピューターから離れる必要があります。ですから、これはあなたが始めるためのものです。
すべての例で機能するバージョンを更新します。
String s1 = "#hello|#what|whatsup|";
String s2 = "#hello#";
String s3 = "|ola|1";
String s4 = "|hello#|what#whatsup#node";
String s5 = "#||##||MiddleRecursion||##||#";
Pattern pattern = Pattern.compile("(#|\\|)((#|\\|)*\\w+(#|\\|)*)(#|\\|)");
Matcher matcher = pattern.matcher(s1);
while(matcher.find()) {
System.out.println(matcher.group(2));
}
#||##||MiddleRecursion||##||#
-->以来||##||MiddleRecursion||##||
、残念ながらブラケット マッチングを行う必要があります。この場合、正規表現を使用した一般的な解決策はありません (| と # の最大連続出現数がわかっている場合は、強制的に機能させることができます)。その理由は、中間再帰があるからです。正規表現は、左または右の再帰のみを解決できます。
これは、正規表現で HTML 解析ができない理由の1 つでもあります。
わかりました、始めます。
したがって、#something# または |something| に一致する必要があります。
それを行う2つの別々の正規表現を書くことができますか?
最初にイライラするのは、パイプ|
が正規表現の魔法の文字であることです。その文字で一致させたい場合は、\\
リンクした他のスレッドに従って、プレフィックスを付ける必要があります。
これら 2 つの正規表現が機能するようになったら、お知らせください。さらに投稿します。
(私は数時間外出しています...)