2008年09月01日

C#の文字列リテラルを正規表現で

   このエントリーをはてなブックマークに追加 Clip to Evernote
C#の文字列リテラルを探す時に正規表現を使ってみた。

Regex rx = new Regex(@"(@""([^""]|"""")*"")|(""([^\\""]|\\.)*"")");
Match strMatch = rx.Match(s);
...


"(@""([^""]|"""")*""



""([^\\""]|\\.)*"")"

を or で繋げているけど、
もっと簡単に書くことはできないのかな。
考えてみたけど難しすぎて諦めた。

ちなみに参考にしたURLは、こちら
refluxflow::memo :文字列リテラルにマッチする正規表現
http://refluxflow.blogspot.com/2007/09/blog-post.html  

Posted by gushwell at 21:56Comments(0)TrackBack(0)

2005年12月12日

(?=regexp) って何?

   このエントリーをはてなブックマークに追加 Clip to Evernote
正規表現の (?= )って表現は何を意味するのだろう。
ある文献を読んでいたら、(?= )の表現が出てきた。
僕は、正規表現をバリバリ使うことはないので、今まで、この表現は使ったことがなかった。

で、MSDNで調べてみたら、あれ、リンクをたどっていたら途中から英語の文献になっちゃった。(これはフィードバックしておこう)

話しを元に戻すと、

どうもMSDNの説明を説明読んでも、いまいちよくわからない。
\w+\s+class
\w+\s+(?=class)
との区別って何だろうか?(?= ) としたことで何が変わるんだろうか。

ということで実際に試してみた。
例えば、"public class" という入力文字列に対して、
"\w+\s*class"
という正規表現だと入力文字列全体と一致する。
一方、
"\w+\s+(?=class)"
だと、"public " と一致した。
ああ、なるほど、
「特定の文字列が後続していないとマッチしないのだけれど、マッチする文字列は、(?= ) の部分は含まない」
ということなのか。

ということは、"public" 部分だけを抜き取りたかったら、
"\w+\s+(?=class)"
じゃなくて、
"\w+(?=\s+class)"
にしなくては、いけないんだな。

なるほど、勉強になりました。
  
Posted by gushwell at 22:27Comments(0)TrackBack(0)

2005年11月29日

C# RegexクラスのMultilineオプション

   このエントリーをはてなブックマークに追加 Clip to Evernote
.NET Framework の Regexクラスのコンストラクタのひとつに、

[C#]
public Regex(string pattern,RegexOptions options);

というものがあります。第1引数は、正規表現を、第2引数は、オプションを指定します。このオプションですが、Multiline というものがあるんですね。
これを使えば、複数行のなかから、ある行を探すのに、1行ごとに Matchメソッドを呼び出すのではなく、複数行丸ごと、Matchメソッドの引数に渡すことができるみたいです。

でも、やってみたら、できません???
正規表現として

^ABC$

を指定し、検索してみても、ABC という行と一致してくれません。

理由は単純。改行コードは、\r\n なのですが、正規表現の $ は、\n と一致するので、Windowsで一般的な \r\n 付きの複数行テキストを検索するには、

^ABC\r$

のように、\r をつけてあげないとだめみたいです。
確かにその通りなんだけど、なんだかな〜
もともと 正規表現は、unixで発達したものなので、行末は、\n なのだけれど、.NETは、Windowsで動かすのだから、Multilineオプションを用意するんだったら、\r\n を 行末 $ と一致させるオプションも併せて用意してくれれば良いのにな。
それとも僕が知らないだけ?
  
Posted by gushwell at 22:05Comments(0)TrackBack(1)