質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JavaServer Faces

JavaServer Faces(JSF)はJavaをベースとしたコンポーネントベースのwebアプリケーション開発用のフレームワークです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

34041閲覧

java 記号文字のエスケープ処理について

rs516

総合スコア12

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JavaServer Faces

JavaServer Faces(JSF)はJavaをベースとしたコンポーネントベースのwebアプリケーション開発用のフレームワークです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/07/18 00:55

編集2016/07/18 03:11

###前提・実現したいこと

javaで禁則文字チェックを作成しています。

禁則文字はプロパティで保持し、javaで取得した際にエスケープが必要な文字が含まれていた場合は
その文字に対してエスケープ処理をしたいです。

禁則文字の一覧は変更可能な設定のため、プロパティの禁則文字じたいにエスケープ処理はいれられません。
あくまでJavaで取得した後に、エスケープ処理をいれたいです。

1.プロパティで保持する禁則文字 : !"#*$%&'()-^@[;:],./
2.エスケープが必要な文字 : ¥ * + . ? { } ( ) [ ] ^ $ - | "

上記「1.」で取得した禁則文字列内に「2.」に該当する文字がある場合は、エスケープ処理を施したいです。

エスケープ前の文字列:!"#$%&'()-^@[;:],./
エスケープ後の文字列:!"#*$%&'()-^@[;:],./\

###該当のソースコード
public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (true) { System.out.println("文字列を入力してください。"); String str = br.readLine(); idCheck(str); }

}

private static void idCheck(String i) {

// 禁則文字 String str = "!"#$%&'()-^\@[;:],./\" // ここにエスケープ処理を実装したいです if (i.matches(".*[" + str + "]+.*")) {// ここで違反文字を判定 System.out.println("NG"); } else { System.out.println("OK"); }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A-pZ

2016/07/18 02:38

エスケープ処理を施したいことはわかりましたが、エスケープ処理をした後に期待する動作がかかれていません。
rs516

2016/07/18 03:13

ご指摘ありがとうございます。処理後の期待結果を追記しました。
yuba

2016/07/18 04:08

禁則文字は削除、エスケープ対象文字はバックスラッシュでエスケープということでしょうか? しかし、禁則のはずの " がエスケープされて残っているようです。これは例の誤りですか?
rs516

2016/07/18 05:08

質問が分かりにくく申し訳ございません。 実施したい事は単純に禁則文字にエスケープ対象があった場合はバックスラッシュでエスケープしたいだけです。 サンプルコードにエスケープ処理のロジックは記載していません。 下記の文字列についてエスケープ対象となる文字をバックスラッシュでエスケープしたいです。 // 禁則文字 String str = "!"#$%&'()-^\@[;:],./\"
guest

回答3

0

エスケープ処理

java

1String str = "(?=[-\\\\*+.?{}()\\[\\]^&|\"])"; 2i = i.replaceAll(str, "\\\\");

先読みで特定の文字を見つけたらその前に\を挟む処理です。
こういうことでよろしいでしょうか。
間違っていましたら指摘をお願いします。

\\ってなっているのは、String型のエスケープと正規表現のエスケープが重なっているためです。

投稿2016/07/18 10:01

編集2016/07/18 10:07
intelf___

総合スコア868

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rs516

2016/07/18 11:55

ありがとうございます。 エスケープ処理後の期待する結果は正に1行目のものです。 私の質問が分かりづらく申し訳ないのですが、今回は事前に禁則文字にエスケープ文字を追加しておくことができないという前提があります。 エスケープなしの禁則文字を取得した後に、エスケープ処理を施したいです。 禁則文字の文字列を1文字ずつ確認し、エスケープ処理を実装するしかないのかと考え中です。
intelf___

2016/07/19 06:22

>エスケープ処理後の期待する結果は正に1行目のものです。 一行目は処理後の結果ではなく処理のための正規表現文字列です。 つまりはこういうことで i = i.replaceAll("(?=[-\\\\*+.?{}()\\[\\]^&|\"])", "\\\\"); ソースコード中のコメント // ここにエスケープ処理を実装したいです の部分にこのコードを埋め込むことで動作します。
guest

0

ベストアンサー

1文字ずつ確認しながら、StringBuilderに入れていくしかないと思います。クラスにしたらこんな感じかなというのを作りました。StringEscaper#escapeStringの所を参考にしてみてください。エスケープ対象の文字はHashSet<Character>に入れておくと良いと思います。ただ、HashSetは同期化されませんのでマルチスレッドで変更される場合は気をつけてください。

Java

1/** 2 * 文字エスケープ処理 3 * U+1000-U+10FFFFの拡張領域には非対応。チェックもしない。 4 * スレッドセーフではない。 5 */ 6 7import java.util.Set; 8import java.util.HashSet; 9import java.util.Collection; 10import java.io.BufferedReader; 11import java.io.InputStreamReader; 12import java.io.IOException; 13 14public class StringEscaper { 15 private Set<Character> escapeTargetCharacterSet; 16 private Character escapeCharacter = '\\'; 17 18 public StringEscaper() { 19 this.escapeTargetCharacterSet = new HashSet<Character>(); 20 } 21 22 public StringEscaper(String escapeTaregtStr) { 23 this(escapeTaregtStr.toCharArray()); 24 } 25 26 public StringEscaper(Collection<Character> escapeTaregtCharacterCollection) { 27 this(); 28 for (final Character c: escapeTaregtCharacterCollection) { 29 this.add(c); 30 } 31 } 32 33 public StringEscaper(char[] escapeTaregtCharArray) { 34 this(); 35 for (final char c: escapeTaregtCharArray) { 36 this.add(c); 37 } 38 } 39 40 public boolean add(char escapeTargetChar) { 41 return this.add(new Character(escapeTargetChar)); 42 } 43 44 public boolean add(Character escapeTargetCharacter) { 45 return escapeTargetCharacterSet.add(escapeTargetCharacter); 46 } 47 48 public boolean needsEscape(char c) { 49 return this.needsEscape(new Character(c)); 50 } 51 52 public boolean needsEscape(Character character) { 53 return this.escapeTargetCharacterSet.contains(character); 54 } 55 56 public String escapeString(String str) { 57 StringBuilder builder = new StringBuilder(); 58 for (final char c: str.toCharArray()) { 59 if (this.needsEscape(c)) { 60 builder.append(this.escapeCharacter); 61 } 62 builder.append(c); 63 } 64 return builder.toString(); 65 } 66 67 public static void main(String[] args) { 68 String target = "\\*+.?{}()[]^$-|\""; 69 StringEscaper stringEscaper = new StringEscaper(target); 70 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 71 while(true) { 72 try { 73 System.out.println("文字を入力してください。"); 74 String line = br.readLine(); 75 if (line == null) { 76 break; 77 } 78 System.out.println(stringEscaper.escapeString(line)); 79 } catch (IOException e) { 80 break; 81 } 82 } 83 } 84}

投稿2016/07/18 07:38

raccy

総合スコア21737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rs516

2016/07/18 12:03

サンプルコードまで書いて頂きありがとうございます。 まさに私の実装したい内容です。やはり1文字ずつ確認していくしかない様ですね。 srcを解析しつつ参考にさせて頂きます。
guest

0

Commons-langのStringUtils#replaceEach を使うと良いでしょうか。

Apache Commonsを使わずに自分で実装を記述したい場合はまた別ですが。

投稿2016/07/18 04:50

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rs516

2016/07/18 05:15

ありがとうございます。 まさに実装したい内容はご提示のメソッドで実現できそうなのですが、 Apache Commonsライブラリを利用せずに実現する方法はないでしょうか? 質問ばかりで申し訳ございません。
退会済みユーザー

退会済みユーザー

2016/07/18 06:41

逆に言うと、Apache Commonsはオープンソースなので、ソースが公開されています。 そのソースを見て、自分なりのコードを作るってのも1つの勉強方法ですね。
rs516

2016/07/18 11:49

ありがとうございます。 Apache Commonsのsrcダウンロードしました。 勉強用にsrc解析してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問