C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

正規表現 連続する\マークは対象外にしたい /青い子豚 (19/12/17(Tue) 15:24) #93518
Re[1]: 正規表現 連続する\マークは対象外にしたい /shu (19/12/17(Tue) 17:30) #93522
Re[1]: 正規表現 連続する\マークは対象外にしたい /魔界の仮面弁士 (19/12/17(Tue) 17:54) #93523
  └ Re[2]: 正規表現 連続する\マークは対象外にしたい /青い子豚 (20/01/09(Thu) 16:12) #93683 解決済み


親記事 / ▼[ 93522 ] ▼[ 93523 ]
■93518 / 親階層)  正規表現 連続する\マークは対象外にしたい
□投稿者/ 青い子豚 (2回)-(2019/12/17(Tue) 15:24:44)

分類:[.NET 全般] 

ある文字列を\マーク1字で区切りたいのですが、連続する\マークは対象外にしたく
以下のようなコードを書きました。

Dim res = Regex.Split("aa\bb\\ccc\\\\ddd", "[^\\]\\[^\\]")
'結果
'a
'b\\ccc\\\\ddd


結果は希望通りに分割されたのですが、他にもっとスマートな書き方や一般的な書き方があるのではと思っています。

ご存じでしたらどうかご教授いただけないでしょうか?
よろしくお願いいたします。
[ □ Tree ] 返信 編集キー/

▲[ 93518 ] / 返信無し
■93522 / 1階層)  Re[1]: 正規表現 連続する\マークは対象外にしたい
□投稿者/ shu (1211回)-(2019/12/17(Tue) 17:30:58)
No93518 (青い子豚 さん) に返信

一般的にそのような処理を行うか分かりませんが
結構スマートだと思います。
ただ
"(?<=[^\\])\\(?=[^\\])"
としないと
aa
bb\\ccc\\\\ddd
このようにならないのですが、大丈夫ですか?(\の前後の文字が区切りとして消えてしまいます)
後、先頭、末尾の\はどうしましょう?
もし分離するのであれば
"(?<=[^\\]|^)\\(?=[^\\]|$)"

[ 親 93518 / □ Tree ] 返信 編集キー/

▲[ 93518 ] / ▼[ 93683 ]
■93523 / 1階層)  Re[1]: 正規表現 連続する\マークは対象外にしたい
□投稿者/ 魔界の仮面弁士 (2531回)-(2019/12/17(Tue) 17:54:17)
No93518 (青い子豚 さん) に返信
> ある文字列を\マーク1字で区切りたいのですが、連続する\マークは対象外にしたく

ということは、各要素内の \ の数は偶数個(0個、2個、4個…)であることが保証されるのですね。
それでは、下記の点はどのようにエスケープされる想定でしょうか。


(1) 空要素はどういう扱いになりますか?
 たとえば「abc」「」「xyz」の 3 要素の場合、「abc\\xyz」になってしまい、
 単一要素「abc\\xyz」と区別できません。


(2) 末尾の \ 要素と、先頭の \ 要素の扱いはどうなりますか?
 たとえば「C:\\」+「Windows」と「C:」+「\\Windows」は
 共に"C:\\\Windows" になってしまい、区別できません。

[ 親 93518 / □ Tree ] 返信 編集キー/

▲[ 93523 ] / 返信無し
■93683 / 2階層)  Re[2]: 正規表現 連続する\マークは対象外にしたい
□投稿者/ 青い子豚 (3回)-(2020/01/09(Thu) 16:12:52)
No93523 (魔界の仮面弁士 さん) に返信
> ■No93518 (青い子豚 さん) に返信
>>ある文字列を\マーク1字で区切りたいのですが、連続する\マークは対象外にしたく
>
> ということは、各要素内の \ の数は偶数個(0個、2個、4個…)であることが保証されるのですね。
> それでは、下記の点はどのようにエスケープされる想定でしょうか。
>
>
> (1) 空要素はどういう扱いになりますか?
>  たとえば「abc」「」「xyz」の 3 要素の場合、「abc\\xyz」になってしまい、
>  単一要素「abc\\xyz」と区別できません。
>
>
> (2) 末尾の \ 要素と、先頭の \ 要素の扱いはどうなりますか?
>  たとえば「C:\\」+「Windows」と「C:」+「\\Windows」は
>  共に"C:\\\Windows" になってしまい、区別できません。
>

ありがとうございました。
解決したのに、お礼と解決チェックを忘れていました。

正規表現の先読み、後読みを勉強してきます。
解決済み
[ 親 93518 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -