2011-06-18 3 views
0

は、私はJavaで、次の正規表現を使用しようとしている正規表現で引用し、それが一致するはずの任意のlang="2-char-lang-name"Javaは、エスケープ(使用)は

String lang = "lang=\"" + L.detectLang(inputText) +"\""; 
shovel.replaceFirst("lang=\"[..]\"", lang); 

私は、単一のスラッシュは正規表現で解釈されることを知っていますスラッシュでエスケープ文字ではないので(私のコードは機能しません)、スラッシュをエスケープすると、"はそれ以上エスケープされず、構文エラーが発生します。言い換えれば

、どのように私は正規表現で"を含めることができますか? "lang=\\"[..]\\""は機能しません。私も3つのスラッシュを試しましたが、それにはマッチもありませんでした。

私はまた、あなたがXML/HTMLを解析するために正規表現を使用していない一般的なルールを知っています。 (shovelはXMLです)しかし、私がやっているのは、XMLの最初の30文字以内のlang属性を探していて、置き換えたいのです。この場合、正規表現を使用することは本当に悪い考えですか?私はDOMの使用はより良い/より効率的であるとは思わない。

答えて

4

3つのスラッシュは、(\\ + \"は= \"\" +となる)が正しいであろう。 (更新:実際には、それが必要すらない判明単一のスラッシュでも動作しますが、それはそう。。)問題は[..]の使用です。 []のシンボルは「ここの文字のいずれか」を意味します([..]は「任意の文字」を意味します)。

ドロップ[]とあなたが欲しいものを得るべきである:

String ab = "foo=\"bar\" lang=\"AB\""; 
String regex = "lang=\\\"..\\\""; 
String cd = ab.replaceFirst(regex, "lang=\"CD\""); 
System.out.println(cd); 

出力:標準やその他もろもろで

foo="bar" lang="CD" 
+0

ああ、私は本当に彼が '[..]'で行っていたことを解析していませんでした。私は '[] 'の中では' .'が文字通り解釈されると考えるので、 '[..]'は '' .'または '.'のいずれかの単一の文字を意味します。 – OpenSauce

+0

ダン...あなたは正しいと思います。私の正規表現はあまりにも錆びたようです。ありがとうございました。 – Spectraljump

2

を使用すると、単一のバックスラッシュでそれを試してみましたか?

public static void main(String[] args) { 
    String inputString = "<xml lang=\"the Queen's English\">"; 
    System.out.println(inputString.replaceFirst("lang=\"[^\"]*\"", "lang=\"American\"")); 
} 

の出力は、私が正しくあなたを読んでいる場合は、あなたが望むものである、

<xml lang="American"> 

です。追加する

EDIT:単一のバックスラッシュが働く理由は、それが実際に文字列の一部ではないということです、それは文字列を表現するための構文のほんの一部です。文字列"\""の長さは2ではなく1であり、方法replaceFirstは、"(バックスラッシュなし)を含む文字列を参照します。これが、例えば\s(正規表現の空白文字クラス)は、Javaの文字列リテラルに\\sと書かれていなければなりません。正規表現を使用しての知恵

:あなたが処理しているファイルの形式について確認している場合、これは、問題ないはずです。ファイルに実際のヘッダーの上にlangのスペックを持つコメントアウトされたヘッダーが含まれている場合は、問題が発生する可能性があります。

+0

いいえ、それはうまく形成のXML。単一のスラッシュが機能することを指摘してくれてありがとう。それは正規表現の特殊文字なので、私はそれがないと思った。 – Spectraljump

関連する問題