2012-03-18 14 views
-2

私は、区切り文字として"<$"とを使用して分割する必要があるJavaの文字列を持っています。 しかし、もし私が"\<$something_we_dont_care_what$>"のようなものを持っていたら、それを無視して移動します。私はしばらくの間、これをやって正規表現を記述しようとしてきたが、私は失敗し、ちょうど私はますます混乱して作っている、Javaの正規表現について読んでくださいJavaでの正規表現のマッチング

...

は誰もが私に権利を伝えることができますこれを行う方法?

ありがとうございます。

+7

実際に動作しないコードを表示します。 – bmargulies

+0

stackoverflow実際の区切り文字は削除されましたが、$($)$の場合はデリミタとして認識されるべきではありません。 – Remiel

+3

@ user1276405 - StackOverflowは何も削除しませんでした。マークアップが間違っています。 Markdownの "ヘルプ"を読んでください...あなたの質問を編集しているときに、そのオレンジ色の疑問符のアイコンを見てください。 –

答えて

0

気にしないでください。 私は数時間のブラウジングと実験を経て解決策を見つけました。 正規表現は次のとおりです。

// char $ needs to be escaped because it has different meaning in regular expressions 
// <$ 
String leftDelimiter = "(<\\$)"; 
// $> 
String rightDelimiter = "(\\$>)"; 

// leftDelimiter | rightDelimiter 
// when used to split a string would split it each time it detected those two patters 
// and it would also split it in the case I dont want them to split it 
// and that is "\<$foo$>" case - when they are "escaped" in the string 

// to solve it we can try to match our leftDelimiter only if char \ isnt before it 

// matches all [$ that dont start with \ 
String fixedLeftDelimiter = "(?<!\\\\)"+leftDelimiter; 

// the problem presents itself with the rightDelimiter because it needs to check 
// whether there had been a leftDelimiter before it that has been escaped 


// the following takes care of that 

// matches all $> that dont have a <$ starting with \ 
String betterRightDelimiter = "(?<!\\\\"+leftDelimiter+whatCanBeInTags+rightDelimiter; 

// whatCanBeInTags is everything that can be in out tags besides $ sign 
// we are using {0,"+(Integer.MAX_VALUE-3)+"}? instead of *? because of a limitation 
// of number of characters put in lookbehind assertion 
String whatCanBeInTags = "[^\\$]{0,"+(Integer.MAX_VALUE-3)+"}?)"; 
0

は、2つの文字列を持って考えて - ないあなたのコードでは、ファイルまたはJTextFieldのから読み取る:

s = "\<$foo$>"; 
p = "[^\\]?<\$[^\$]*\$>"; 

そして、あなたは文字列にパターンをマッチさせたいです。バックスラッシュ[^\\]?が含まれていませんが、オプションであるかもしれない

  • グループを、私がこれまで行ってきた何

  • <$ドルは特殊正規表現として、バックスラッシュでマスクする必要があります。
  • フリーダイヤルの別のドルを含まないグループ[^\$]*
  • ドルより大きい\$>のドル。再び:ドルのマスク。

foo-partまたはsomething_we_dont_care_whatにドル記号が含まれていても、>の後ろには、ドメインの質問があります。私は思っていませんでした。

s.match (p); 

trueまたはfalseを返す必要がありますが、問題はコードに取り込む方法です。問題は正規表現だけでなく、Java自体がバックスラッシュをマスキング文字として扱うことです。だから、あなたがそれらのそれぞれを倍増する必要があります。

p = "[^\\\\]?<\\$[^\\$]*\\$>"; 

テストケースがあまりにもあなたのコード内のリテラルテキストであれば、これはあまりにもそれに適用されます。

"\\<$foo$>".matches (p); 

はそれらをしようとすると、多くの場合、良いアイデアです2つのJTextFieldを持つシンプルなGUI、またはプロパティファイルからパターンを読み取るコードを使用すると、Javaマスキングを省略できるツールがあれば、繰り返し再コンパイルする手間を省くことができます。

public class PM 
{ 
    public static void main (String args[]) 
    { 
     String bad = "\\<$foo$>"; 
     String good = "<$foo$>"; 
     String p = "[^\\\\]?<\\$[^\\$]*\\$>"; 
     System.out.println ("bad:\t" + bad.matches (p)); 
     System.out.println ("good:\t" + good.matches (p)); 
    } 
} 
+0

Stringと一致するメソッドでは動作しますが、splitで使用した場合は動作しないという問題があります。 – Remiel

+0

そしてサイドノートでは、 "<?"を付けないと ""( ""ではなく)に一致する必要があります。その場合は "\ "全体を無視するはずです。 – Remiel

+0

"<$b$> c"があり、それをa、b、cに分割したいのですが?バックスラッシュで終わる場合を除いて。しかし、 "a <$ b <$c" or "a$> b $> c"と一致させたくありません。だから、私は2つのマッチをしなければならないと思います。最初は表現全体をチェックし、もう1つはそれを分割します。 –