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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

6502閲覧

SHIFJIS以外の文字列を検索し、該当の文字列を削除したい。

DENQ

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2016/09/27 01:41

お世話になっております。

###前提・実現したいこと
SHIFJIS以外の文字列を検索し、該当の文字列を削除したい。

###発生している問題・エラーメッセージ

エラーは特に出ていません

###該当のソースコード

C#

1 public static bool JudgeSJIS(int id, string s, out string rtnst) { 2 //ひらがな 3 string pattern = @"\p{IsHiragana}"; 4 //カタカナ 5 pattern += @"|[\p{IsKatakana}\u31F0-\u31FF\u3099-\u309C\uFF65-\uFF9F]"; 6 //漢字 7 pattern += @"|[\p{IsCJKUnifiedIdeographs}" + 8 @"\p{IsCJKCompatibilityIdeographs}" + 9 @"\p{IsCJKUnifiedIdeographsExtensionA}]|" + 10 @"[\uD840-\uD869][\uDC00-\uDFFF]|\uD869[\uDC00-\uDEDF]"; 11 //数字 12 pattern += @"|[0-90-9]"; 13 //英字 14 pattern += @"|[a-zA-Z]|[a-zA-Z]"; 15 //スペース 16 pattern += "|[ , ]"; 17 //記号 18 pattern += "|[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\-\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]]"; 19 pattern += "|[々.・”:;/-()<>、。~←↑→↓〈〉《》「」‘’“”[]{}{}【】]"; 20 pattern += "|[◆■◇□※★☆#%!×÷+-]"; 21 pattern += "|[、]"; 22 pattern += "|[┏┛┗┓┌┘└┐]"; 23 pattern += "|[㎜]"; 24 pattern += "|[ⅠⅡ]"; 25 pattern += "|[㍻℡]"; 26 pattern += "|[〔〕]"; 27 //正規表現でSJIS以外を抽出 28 string tmps = Regex.Replace(s,pattern,""); 29 if ( tmps.Length == 0 ) { 30 rtnst = s; 31 return true; 32 } else if ( tmps.Length == 1 ) { 33 rtnst = s.Replace(tmps, ""); 34 return true; 35 } else { 36 //SJIS 文字以外が存在する。 37 rtnst = string.Empty; 38 return false; 39 } 40 } 41 42

###試したこと
[](string sに入ってくる文字列)
stringのsには写真の文字列が入ってきます。
DO,MOを抽出したいのです。
最後のif文でtmpsの長さが1であれば変更でそれ以外は空文字で返すというプログラムなってますが、
実際にはshiftjis以外の文字列が複数入ってる可能性もありました。
なので、条件式を変えて

else if ( tmps.Length >= 1 ){ rtnst = s.Replace(tmps, ""); }

に変えてshifjis以外の文字列を削除したのですが、rtnstに写真と同じ文字列が代入されます。

string tmps = Regex.Replace(s,pattern,"");

この部分でshiftjis以外の文字列を抽出しているので、その文字列だけを削除したいのでreplaceしたのですが、うまく行きませんでした。
なにか考え方が間違っていますでしょうか?
ご教授よろしくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
windows8.1
.net framework3.5
C#

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

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

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

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

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

htsign

2016/09/27 01:50 編集

回答ではないのでこちらに記載しますが、stringの結合を繰り返す場合はStringBuilderクラスを使った方がいいです。 と思いましたが、この例の場合は最適化で勝手に一つの文字列になるかもしれませんね。失礼しました。
guest

回答2

0

こんにちは。

回答ではないのですが、用語が少し気になりました。
SHIFJISという用語はたぶん存在しないと思います。Shift-JISならあるのでこれの間違いではないでしょうか。

そして、Shift-JISは文字コードの種類を示す用語です。
C#が使う文字コードはShift-JISではなくUnicode(UTF-16)です。
ご提示されたプログラムでも\uが使われているのでUnicodeで文字を指定しているようです。

もしかすると、SHIFJISを「漢字」や「日本語」の意味でお使いでしょうか?
もし、そうであれば、それは誤用です。

投稿2016/09/27 03:30

Chironian

総合スコア23272

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

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

0

ベストアンサー

tmpsに入っているのはshiftjis以外の文字列ですよね?
string#Replace(string, string)のオーバーロードは、インスタンス文字列の中から第一引数に与えられた文字列を第二引数で与えられた文字列に置換して返すメソッドです。

c#

1string ex1 = "abcdabcd".Replace("ab", ""); 2string ex2 = "abcdabcd".Replace("ac", "");

ここでex1"cdcd"となりますが、ex2"bdbd"とはならず"abcdabcd"のままです。
この結果を考えれば、rtnst = s.Replace(tmps, "");で質問者さんが期待した結果は得られないと思いませんか?
文字列から「文字列ではなく文字を削除する」ためにはDOBON.NETさんが詳しいです。

ただしこの質問のケースでは文字コードが異なるので正しく文字が拾えない可能性もあります。

投稿2016/09/27 02:25

htsign

総合スコア870

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

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

DENQ

2016/09/27 02:39

回答ありがとうございます。 納得がいきました。文字列を一文字ずつ分解して、patternにマッチするかどうかを見るしかないでしょうか?
htsign

2016/09/27 02:44

string ex2 = "abcdabcd".Replace("a", "").Replace("b", ""); とするのでも string ex2 = Regex.Replace("abcdabcd", "[ab]", ""); とするのでも結果は一緒です。 rtnst = Regex.Replace(s, "[" + tmps + "]", ""); とすれば消せる可能性があります。 ただし、回答でお答えした通り文字コードが違うために問題が起きるかもしれません。
DENQ

2016/09/27 02:55

正常に取り出す事が出来ました。 よかったです。また一つ勉強になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問