Javaというよりも、正規表現について質問です。
(一応、言語はJavaで、String#replaceAllを使います)
以下のルールで与えられた文字列の置換を行う正規表現を考えていますが、なかなかうまくいきません。
1.正規表現で \w+:: にマッチする文字列を削除する。
2.ただし、'' (シングルクォーテーション)で囲われている文字列は
1.の対象としない
3.ただし、\' (シングルクォーテーションの前に\があった場合は)
シングルクォーテーションと認識しない。
例:
置換前 A * B \'' CCC.DD::EEE' FFF.GGG::HH ' III'
置換後 A * B \'' CCC.DD::EEE' FFF.HH 'III'
色々試してみたのですが、どうしてもうまくいきません。
正規表現が得意な方、教えていただけますでしょうか・・?
No.2ベストアンサー
- 回答日時:
> 置換前 A * B \'' CCC.DD::EEE' FFF.GGG::HH ' III'
> 置換後 A * B \'' CCC.DD::EEE' FFF.HH 'III'
最後の部分が、置換前は ' III' と空白があるのに置換後は
'III' になっているのは何かの間違いですか?
import java.lang.*;
import java.util.regex.*;
public class Ans9479 {
/***
1.正規表現で \w+:: にマッチする文字列を削除する。
2.ただし、'' (シングルクォーテーション)で囲われている文字列は
1.の対象としない
3.ただし、\' (シングルクォーテーションの前に\があった場合は)
シングルクォーテーションと認識しない。
例:
置換前 A * B \'' CCC.DD::EEE' FFF.GGG::HH ' III'
置換後 A * B \'' CCC.DD::EEE' FFF.HH 'III'
**/
public static void main(String[] args) {
String test_data = "A * B \\'' CCC.DD::EEE' FFF.GGG::HH ' III'";
String test_result = "A * B \\'' CCC.DD::EEE' FFF.HH ' III'";
String pat = "\\G((?:(?:(?<!\\\\)'[^']*')|(?:\\w*?\\W*?))*)\\w+::";
String result = test_data.replaceAll(pat, "$1");
System.out.println(test_data);
System.out.println(result);
System.out.println(test_result);
if (test_result.equals(result)) {
System.out.println("あってるっぽい");
}
else {
System.out.println("だめじゃね?");
}
}
}
実行結果:
A * B \'' CCC.DD::EEE' FFF.GGG::HH ' III'
A * B \'' CCC.DD::EEE' FFF.HH ' III'
A * B \'' CCC.DD::EEE' FFF.HH ' III'
あってるっぽい
すげー危ないパターンなので、食わせるデータによってはとんでもなく
時間がかかって死ねます。
改良できるけど眠いのでやらない。
ありがとうございます。
まさに求めていたモノです。
しかし・・・複雑ですね。
\\Gとか?:とか?<!とか使ったことないものが沢山出てきました。
色々と研究してみます。
現実的にはメンテナンス性が低そうなのでダメかもしれませんが、
勉強になりました。
No.1
- 回答日時:
正規表現だけで''(シングルクォーテーション)で囲まれていない文字列の一部分を指定するのは難しいような気がします(できるのだろうか??おもいつきません)。
そもそもどこからどこまで''に囲われているかを判定はどうするのか??最初に指定の条件に沿って文字列を区切り、
''に囲われている文字列以外に対して、
\w+:: にマッチする文字を削除する。
最後に区切った文字を連結するとかいう方法ではだめですか?
A * B \'
' CCC.DD::EEE'→対象外
FFF.GGG::HH
' III'→対象外
あまり答えになっていないかもしれませんが。。
以上
ありがとうございます。
::をマッチさせるときに ' が二つごとにあれば(偶数であれば)
というマッチができればできなくは無いと思いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) テキストエディタで複数行にわたる文字列の行頭に番号を振る方法 4 2023/03/11 12:57
- オープンソース csvデータのダブルクォーテーションで囲まれた文字内にあるカンマを削除したい 3 2022/09/02 15:17
- その他(コンピューター・テクノロジー) 正規表現の置換で一部の文字列をそのまま残したい 2 2022/05/03 19:19
- フリーソフト サクラエディタの正規表現(grep機能)の使い方 3 2022/06/22 10:29
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- Visual Basic(VBA) Excel VBAでAA(BBB) → BBB.AA に置換したい 2 2022/10/30 13:59
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
- その他(プログラミング・Web制作) 変換のプログラムを教えてください。 6 2023/07/01 09:57
- Windows 10 Windowsのバッチファイルで正規表現の置換方法について… 4 2022/12/09 16:00
- Access(アクセス) AccessVBAで任意の複数リンクテーブルをAccessVBAを動かす際に削除したいと考えておりま 1 2022/11/17 15:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カタカナの小文字を大文字に変...
-
小文字、大文字変換
-
改行コードの置換が…
-
正規表現で少し複雑な置換がしたい
-
staticメソッドの継承
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
System.err. printlnとSystem.o...
-
ループ処理の際、最後だけ","を...
-
javaで質問です。 文字列2023/2...
-
1~100までの数字を表示し、か...
-
EXCEL VBA で、0から?1から?
-
flush()とclose()について
-
変数を動的に利用するには?
-
数値⇒漢数字変換 java
-
java キーボード入力された値の...
-
ORA-01858: 数値を指定する箇所...
-
[JAVA]try 内の変数を外で!?
-
java
-
Javaで改行などが出来ないのです。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カタカナの小文字を大文字に変...
-
staticメソッドの継承
-
JAVA Servlet での全角文字判定
-
C# 特定文字の数を調べる方法を...
-
改行コードの置換が…
-
C#の質問
-
教えてください
-
JAVAで全角カナチェックの方法
-
C言語のポインターに関する警告
-
ループ処理の際、最後だけ","を...
-
javaで質問です。 文字列2023/2...
-
[JAVA]try 内の変数を外で!?
-
System.err. printlnとSystem.o...
-
ダブルクォーテーションのrepla...
-
IF関数でEmpty値を設定する方法。
-
パソコンキーボードで時分秒を...
-
プログラミングの問題です。大...
-
1~100までの数字を表示し、か...
-
VBAで配列の計算
-
Javaで改行などが出来ないのです。
おすすめ情報