2017-04-10 11 views
-2

私はJava regexパッケージを使用するPentahoに取り組んでいます:java.util.regex。私は無視してしようとする文字列の長い部分があるRegex - 文字列の一部を無視する

^StartofString Controls\(param1="(D[0-9]{0,})",param2="(G[0-9]{0,})",param3="([^"]{0,})",param4="([^"]{0,})"\):(?:.*)param5="([^"]{0,})",.* 

は、私は両方の開始と、文字列の末尾からテキストファイルの行から多くの情報を抽出したいですdo with so (?:.*)

ステップでRegexをテストすると正の先読みが機能しているように見えますが、変換を実行すると機能しません。 私は、「フィルター行のJavaScriptステップ内で、前のステップと抽出グループのブールに確認し、「正規表現の評価」段階に文字列をテスト:patterStrが1つ以上同じ正規表現された状態で

var pattern = Packages.java.util.regex.Pattern.compile(patternStr); 
var matcher = pattern.matcher(content.toString()); 
var matchFound = matcher.find(); 

" \

正規表現で文字列の一部を無視することについて多くの質問を読んだが、答えが見つからない。 何か助けを歓迎します。 必要に応じてより多くの情報を提供できます。

+3

ないアイデアをどのようなあなたの問題はです。一つのことは確かです。 '(?:。*)'はキャプチャしていないグループであり、先読みではありません。 –

+0

変換コードを確認できますか?非キャプチャグループを使用すると、そのトリックは実行されません。非キャプチャグループとは、キャプチャグループが存在しないことを意味しますが、一致するテキストはまだ出力に存在します。グループではない – Aaron

+0

...私はキャプチャしていないグループと先読みを混ぜています。私が望むのは、param5に達するまで、文字列の大きな部分を捕まえないことです。 完全な変換を見るとどのように役立つのかわかりません。私が表示すべきではない分かりやすい情報があります。 – v01dv01d

答えて

1

非キャプチャグループとは、そのコンテンツがキャプチャされないことを意味するものではなく、グループ内でキャプチャされないことを意味します(ただし、まだ正規表現内のトークンをグループ化しています一度に変更子を適用する)。

は例えば、これらの正規表現は、すべてがまったく同じabc文字列にマッチします:

abc 
a(?:b)c 
a(b)c 

しかし三番目のケースでは、あなたが独立して bにアクセスすることができるようになりますキャプチャグループを定義しました。最初の2つのケースはすべての点で同等です。

非キャプチャグループは、後で参照できる余分なグループを持たずにトークングループにモディファイアを適用する場合に便利です。次regexsはすべて同じ文字列にマッチします:

(ab)*(c)\2 
(?:ab)*(c)\1 

は、我々はabトークンに*を適用したいです。キャプチャグループ(最初の例)でそれを行い、参照可能なグループを作成するか、または非キャプチャグループを使用します。正規表現の末尾の逆参照は、cと一致するはずです。最初の例ではabが最初のものであるので2番目のグループですが、2番目には参照できる最初のグループはcです。

ここでは、キャプチャしていないグループが何をしているのか説明しました。あなたの問題を解決しましょう。文字列の中央から何かを削除します。

Aremove-thisB 

そして、あなたは結果ABをしたいこと:

のは、あなたが一致する文字列を想定してみましょう

は次のとおりです。

がそうするために、複数の戦略があり、あなたのケースで最も簡単にはおそらく、独自のキャプチャグループ内の文字列の先頭と末尾の両方に一致し、そこから自分の出力を作成することです:

var pattern = Packages.java.util.regex.Pattern.compile("(A).*(B)"); 
var matcher = pattern.matcher(content.toString()); 
var matchFound = matcher.find(); 
if (matchFound) { return matcher.group(1) + matcher.group(2); } 
+0

あなたの正確な答えをありがとうが、それでも私の質問に完全に答えていません。 一致したい文字列は のようになります。 'A = text1、remove-this、B = text2' そして、text1とtext2を別々にキャプチャしたいです。 – v01dv01d

+0

@ v01dv01dは' text1'を参照できるようにキャプチャグループを使います。 ( '^、*)。* B =([^、] *)'にマッチすると、あなたのマッチャーの '.group(1)'は 'text1'と' 'text2'を含みます。グループ(2) '' text2'。 '[^、] *'は、次のカンマまでをすべてマッチします。 – Aaron

+0

私は論理を得て試しましたが、それでも動作しません。 これは正規表現の見た目です: '^ GetAndUpdate pcParamQualite \(sDomaineApplicatif ="(D [0-9] {0}) "、sApplication ="(G [0-9] {0、}) )、sFonctionnalite = "([^"] {0、}) "、sNumeroOrdre ="([^ "] {0、})" \):。* sCodeMsgExpliControle = "([^"] {0、}) "、。*' 私が無視したいのは、コロンとsCodeMsgExpliControleの間にあります(それ以降は、私はそれをカットします) – v01dv01d

関連する問題