2016-06-16 7 views
1

正規表現に少し慣れています。私は変数を内部でJavaで正規表現を作成しようとしています。Javaで変数を使用して正規表現を作成する

"var"、 "(var)"、 "[var]"、または "{var}"と変数varの大文字と小文字のバリエーションを一致させたいと思います。

私はこれを試してみましたが、例外を持っているようだ:
java.util.regex.PatternSyntaxException: Unclosed character class near index 20

誰もがこれを修正し、改善するためにどのように任意の提案を持っていますか?関係は、言語に組み込まれていないので(に)ブレースの

+0

あなたの例で '[Tom]'が一致するはずですか? –

+0

@AndrewRueckert返答いただきありがとうございます、そうではありません。 – Ninja

答えて

1

試してみてください。

String s = "[Tom] The rest of the title"; 
String v = "Tom"; 

String myRegexp = String.format("(?i)\\[%s\\]|\\{%s\\}|\\(%s\\)|%s", v,v,v,v); 
System.out.println(myRegexp); 

s = s.replaceAll(myRegexp, ""); 
System.out.println(s); 

このライン: (?i)\[Tom\]|\{Tom\}|\(Tom\)|Tom

すべてのブレース:

String myRegexp = String.format("(?i)\\[%s\\]|\\{%s\\}|\\(%s\\)|%s", v,v,v,v); 

は単純な正規表現を構築{}[]()は、正規表現での特殊文字であり、それらはでなければなりません\文字でエスケープします(Java文字列では\\である必要があります)。

+0

お返事ありがとうございます!これは "学校にはあまりにも冷たく"、 "[あまりにも冷たい学校に]こんにちは"には対応していますか?これをタイトルから削除するようなことはありません! – Ninja

+0

はい、新しい文字列で 'Tom'を置き換えて、' v' ==> 'String v =" Too Cool for School "に代入すると動作します; – krokodilko

+0

素晴らしい答え!これはまさに私が探していたものですが、もう少し拡張すると、 "Tom"の周りのすべての特殊文字を削除するのはどうでしょうか?たとえば、文字列は "{[[Tom]]}"のようなもので、文字列全体を空の文字列に置き換えたいと思うでしょう。両側の空きスペースまですべての文字を削除できますか? – Ninja

1
String s = "[Tom] The rest of the title"; 
String v = "Tom"; 

s = s.replaceAll("(?i)[({/[]*" + v + "[)}\]]*", ""); 
System.out.println(s); 

マッチングペアは、{に}、など、正規表現を厄介になるだろう。 naieveソリューションは、次のようになります。

String s = "[Tom] The rest of the title (TOM] tom"; 
String v = "Tom"; 
Pattern p = Pattern.compile("\\(" + v + "\\)|\\{" + v + "\\}|\\[" + v + "\\]|(?![{(\\[])" + v + "(?![})\\]])", Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher(s); 
System.out.println('\'' + m.replaceAll("") + '\''); 
// ' The rest of the title (TOM] ' 

Javaで正規表現の頭部痛-Yの部分はリテラルバックスラッシュ文字がに表示したいので、あなたは、\\二重のエスケープに任意のリテラル文字を必要とするということです正規表現コンパイラに渡す文字列。

+0

ほとんどの場合、より読みやすく優雅なものはありますか? – Ninja

関連する問題