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

わんくま同盟

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

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

■85023 / 7階層)  正規表現の考え方がわかりません
□投稿者/ Hongliang (564回)-(2017/09/05(Tue) 15:43:55)
正規表現においては、[ ] は特別な文字です。なので、文中に紛れると正規表現的な意味の [ ] なのか単に文字列を強調するためのものなのか区別がつかなくなります。
ここでは二重引用符 "" で文字列を強調することにします。"." であれば、正規表現中に . と記述することを意味します。

> [+] が [.+] になると [.+]かどうかの判断にならずに、フロート型数値文字列をとれるようになるのでしょうか?

"+" は、「直前の文字が1回以上出現する」にマッチします。
が、"(?<a>+)" と記述した場合、 "(?<a>" の部分は文字ではなくグループ化およびグループ名のためのものであり、文字ではありません。
なので、「直前の文字」が存在せず正規表現の解析時に実行時例外になるでしょう。

"." は、「任意の1文字」にマッチします。
".+" とすると、「「任意の1文字」が1回以上出現する」にマッチすることになります。

なお、"[+]" は、まず "[ ]" によって、「その中のいずれかの文字」にマッチすることになります。
"[ ]" の内部では "+" のような普段の正規表現中では特殊な文字も、普通の文字として扱われます。
なので、"[+]" は、「"+" のいずれかの文字」、つまり "+" にマッチすることになります。

> また Rectangle ra = new Rectangle(1, 12, 234, 4); としてマイナスがない状態なのに
> Match m = new Regex(@"{X=(?<X>[-]*\w+,Y=(?<Y>[-]*\w+,Width=(?<Width>[-]*\w+),Height=(?<Height>[-]*\w+)}").Match(ra.ToString());
> これがいけて次のがいけなくなる理由もわかりません
> Match m1 = new Regex(@"{X=(?<X>*\w+),Y=(?<Y>*\w+),Width=(?<Width>*\w+),Height=(?<Height>*\w+)}").Match(ra.ToString());

"*" は「直前の文字が0回以上出現する」にマッチします。
しかし "+" のときと同じく、"(?<X>" が文字ではないので、その直後に "*" を置くことはできません。

> [-]はマイナスフラグを取得するためのものではないのでしょうか?

最初の正規表現ではマイナス符号を取得するためのものですね。
"[ ]" で囲む意味はないし、* だと2つ以上連続していても許されてしまう問題がありますが。

> と、同時に[\w+]は文字をとってくるための手段ではないってことですか?

"\w+" は、アルファベット・数字・アンダースコアのみで作られている部分文字列にマッチさせるものです。
正規表現では "[a-zA-Z_0-9]+" と等価ですね。

> \w で1文字とってきて、\w+ は連続した文字をとってくるという認識が崩れてしまいました。
> 例えば "ABC" の3文字をとる場合、 ~\w\w\w" でも "\w+" でも取得できると思っていたのですが・・・

先の投稿で「いけませんでした」とだけ書かれていますが、単にマッチしなかったのと、正規表現の解析失敗による実行時例外をごっちゃにしていませんか?
例えば
new Regex(@"{X=(?<X>*\w+)")
は、先ほども言ったように "*" の前に文字がないので、不正な正規表現となり、実行時例外が発生します。
これは "\w" が何にマッチするか以前の話です。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[6]: 正規表現の考え方がわかりません /夜叉丸 →Re[8]: 正規表現の考え方がわかりません /ペイビン
 
上記関連ツリー

正規表現の考え方がわかりません / 夜叉丸 (17/09/05(Tue) 09:40) #85005
Re[1]: 正規表現の考え方がわかりません / ペイビン (17/09/05(Tue) 10:05) #85007
│├ Re[2]: 正規表現の考え方がわかりません / WebSurfer (17/09/05(Tue) 10:54) #85009
│└ Re[2]: 正規表現の考え方がわかりません / 夜叉丸 (17/09/05(Tue) 12:46) #85013
Re[1]: 正規表現の考え方がわかりません / WebSurfer (17/09/05(Tue) 10:47) #85008
│└ Re[2]: 正規表現の考え方がわかりません / 夜叉丸 (17/09/05(Tue) 12:49) #85014
│  ├ Re[3]: 正規表現の考え方がわかりません / WebSurfer (17/09/05(Tue) 15:07) #85021
│  ├ Re[3]: 正規表現の考え方がわかりません / WebSurfer (17/09/05(Tue) 15:53) #85024
│  │└ Re[4]: 正規表現の考え方がわかりません / Hongliang (17/09/05(Tue) 16:03) #85025
│  │  └ Re[5]: 正規表現の考え方がわかりません / WebSurfer (17/09/05(Tue) 17:16) #85026
│  │    └ Re[6]: 正規表現の考え方がわかりません / 魔界の仮面弁士 (17/09/05(Tue) 18:47) #85028
│  │      └ Re[7]: 正規表現の考え方がわかりません / 夜叉丸 (17/09/12(Tue) 11:49) #85128
│  │        └ Re[8]: 正規表現の考え方がわかりません / 魔界の仮面弁士 (17/09/12(Tue) 12:11) #85131
│  └ Re[3]: 正規表現の考え方がわかりません / WebSurfer (17/09/05(Tue) 19:27) #85030
│    └ Re[4]: 正規表現の考え方がわかりません / 夜叉丸 (17/09/12(Tue) 10:20) #85122
│      ├ Re[5]: 正規表現の考え方がわかりません / Hongliang (17/09/12(Tue) 10:38) #85123
│      │└ Re[6]: 正規表現の考え方がわかりません / 夜叉丸 (17/09/12(Tue) 10:48) #85124
│      └ Re[5]: 正規表現の考え方がわかりません / WebSurfer (17/09/12(Tue) 12:11) #85130
Re[1]: 正規表現の考え方がわかりません / 魔界の仮面弁士 (17/09/05(Tue) 10:57) #85010
  └ Re[2]: 正規表現の考え方がわかりません / 夜叉丸 (17/09/05(Tue) 13:55) #85015
    └ Re[3]: 正規表現の考え方がわかりません / Hongliang (17/09/05(Tue) 14:13) #85016
      └ Re[4]: 正規表現の考え方がわかりません / 夜叉丸 (17/09/05(Tue) 14:28) #85017
        └ Re[5]: 正規表現の考え方がわかりません / ペイビン (17/09/05(Tue) 14:37) #85019
          └ Re[6]: 正規表現の考え方がわかりません / 夜叉丸 (17/09/05(Tue) 14:49) #85020
            ├ Re[7]: 正規表現の考え方がわかりません / shu (17/09/05(Tue) 15:10) #85022
            └ 正規表現の考え方がわかりません / Hongliang (17/09/05(Tue) 15:43) #85023 ←Now
              └ Re[8]: 正規表現の考え方がわかりません / ペイビン (17/09/05(Tue) 18:20) #85027
                └ Re[9]: 正規表現の考え方がわかりません / 夜叉丸 (17/09/12(Tue) 09:43) #85121

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信