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

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

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

Re[11]: 正規表現で、且つの記述方法


(過去ログ 47 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■25499 / inTopicNo.1)  正規表現で、且つの記述方法
  
□投稿者/ たこやき (25回)-(2008/09/20(Sat) 16:32:05)

分類:[C#] 

いつも助けられています。

正規表現の記述例を学習中なのですが、
どちらかの文字を含む等の記述は見かけるのですが、
両方の文字を含む記述例が見つかりません。
申し訳ありませんがご指導下さい。

//失敗状態
private void button1_Click(object sender, EventArgs e)
{
string[] ss =
{ "かきくあい", "かき", "あいう", "あいうかき" };

// 「あい」と「かき」を含むものを抽出する
Regex rg = new Regex("(かき)+" + "(あい)+");

var aa =
from p in ss
where rg.IsMatch(p.ToString())
select p;

foreach (string a in aa)
Console.WriteLine(a.ToString());
}

引用返信 編集キー/
■25506 / inTopicNo.2)  Re[1]: 正規表現で、且つの記述方法
□投稿者/ も (37回)-(2008/09/20(Sat) 18:59:45)
No25499 (たこやき さん) に返信
.*(あい).*(かき).*|.*(かき).*(あい).*
でいけるかな?
単一の正規表現じゃなく素直にString.indexof()で調べたほうがいいかも.
引用返信 編集キー/
■25511 / inTopicNo.3)  Re[2]: 正規表現で、且つの記述方法
□投稿者/ たこやき (26回)-(2008/09/20(Sat) 22:36:10)
もさん、ありがとうございます。
まだテストはしていませんが、いけると思います。
でも、ちょっとあらっぽい記述ですね。
もっと簡単な方法はないのでしょうかね。
4文字にもなったら何通り記述しなきゃーならないか……

> 単一の正規表現じゃなく素直にString.indexof()で調べたほうがいいかも.
これはたいへん参考になります。
複数文字に対しては再帰で行えばいいのですよね。
今手元にコンピュータがありませんが、たのしみです。
ありがとうございました。
引用返信 編集キー/
■25512 / inTopicNo.4)  Re[3]: 正規表現で、且つの記述方法
□投稿者/ Ognac (12回)-(2008/09/20(Sat) 22:53:17)
それじゃ、"あいうかき"がひっかからないのでは、
それも、引っかけるなら、
Dim pat As String = "(?=.*あい)(?=.*かき)"
でどうでせう。
引用返信 編集キー/
■25513 / inTopicNo.5)  Re[4]: 正規表現で、且つの記述方法
□投稿者/ たこやき (27回)-(2008/09/20(Sat) 23:17:44)
Ognacさん、ありがとうございます。
> それじゃ、"あいうかき"がひっかからないのでは、
> それも、引っかけるなら、
> Dim pat As String = "(?=.*あい)(?=.*かき)"
ちょっと僕の現レベルでは理解できませんが、
それにテストもできない状況ですが、
先ずはお礼を送信させていただきます。
実験後改めて報告させていただきます。ありがとうございました。
引用返信 編集キー/
■25514 / inTopicNo.6)  Re[4]: 正規表現で、且つの記述方法
□投稿者/ れい (796回)-(2008/09/21(Sun) 00:47:57)
No25512 (Ognac さん) に返信
> それじゃ、"あいうかき"がひっかからないのでは、

ひっかかります。
問題ないはずです。
改行とか濁点などの扱いは問題な場合もあるでしょうが。

No25511 (たこやき さん) に返信
> でも、ちょっとあらっぽい記述ですね。
> もっと簡単な方法はないのでしょうかね。
> 4文字にもなったら何通り記述しなきゃーならないか……

なんでもそうですが、向き不向きがあります。

> // 「あい」と「かき」を含むものを抽出する

という行為が正規表現にはあまり向いていません。
理由は正規表現の仕組みを考えればわかるかと。

正規表現は他のプログラミング言語に組み込んで使うように設計つくられてますから、
「且つ」という操作は要らないというだけですね。

一つの物事にこだわるのもいいですが、
状況に応じて適切なものを選ぶのが賢いと思います。
引用返信 編集キー/
■25515 / inTopicNo.7)  Re[5]: 正規表現で、且つの記述方法
□投稿者/ Ognac (13回)-(2008/09/21(Sun) 01:07:37)
No25514 (れい さん) に返信
> ひっかかります。
ですね。 はやとちり。

> 一つの物事にこだわるのもいいですが、
無理して、Regexで処理する必要もないのですが、  xxxかつ yyy 程度なら、Regexの守備範囲かと
xxx かつ yyy かつ zzzz と条件が増えたとき、楽できそうです。

引用返信 編集キー/
■25516 / inTopicNo.8)  Re[6]: 正規表現で、且つの記述方法
□投稿者/ れい (797回)-(2008/09/21(Sun) 01:32:01)
No25515 (Ognac さん) に返信
> 無理して、Regexで処理する必要もないのですが、  xxxかつ yyy 程度なら、Regexの守備範囲かと
> xxx かつ yyy かつ zzzz と条件が増えたとき、楽できそうです。

どこまで何をがんばるかはその人の能力とか嗜好とか要求されるもの次第ですね。
正規表現を全く使わない人もいますし。

私は今回のような「且つ」に対して正規表現はあまり使いません。

正規表現の.Net方言はあまりメジャーでないので必要が無い限りは使いたくありませんし、
正規表現に対しての「且つ」は問題を分割しにくいので。

今回はString.Containsを使えばいいだけなのでなおさら。


あーでも

> 正規表現の記述例を学習中なのですが、

学習中ならいろいろやってみるのはよいことだと思います。

> 複数文字に対しては再帰で行えばいいのですよね。

この辺よくわかりませんが…

引用返信 編集キー/
■25519 / inTopicNo.9)  Re[7]: 正規表現で、且つの記述方法
□投稿者/ も (41回)-(2008/09/21(Sun) 08:22:55)
No25516 (れい さん) に返信
> ■No25515 (Ognac さん) に返信
>>無理して、Regexで処理する必要もないのですが、  xxxかつ yyy 程度なら、Regexの守備範囲かと
>> xxx かつ yyy かつ zzzz と条件が増えたとき、楽できそうです。
>
> どこまで何をがんばるかはその人の能力とか嗜好とか要求されるもの次第ですね。
> 正規表現を全く使わない人もいますし。
>
> 私は今回のような「且つ」に対して正規表現はあまり使いません。

(質問者でないですが)ちょっと正規表現に疎いので質問です.
「同じ文字が10文字以上連続」したた後に「それとは違う文字が4文字連続」する.
みたいな正規表現は書けますかね.
(マッチした文字列の部分集合を,マッチング中に参照する方法ってありましたっけ?)
引用返信 編集キー/
■25520 / inTopicNo.10)  Re[8]: 正規表現で、且つの記述方法
□投稿者/ れい (798回)-(2008/09/21(Sun) 09:52:11)
No25519 (も さん) に返信
> (質問者でないですが)ちょっと正規表現に疎いので質問です.
> 「同じ文字が10文字以上連続」したた後に「それとは違う文字が4文字連続」する.
> みたいな正規表現は書けますかね.
> (マッチした文字列の部分集合を,マッチング中に参照する方法ってありましたっけ?)

未検証ですが、こんなんではだめ?

(?<c>.)\k<c>{9,}(?!\k<c>)(?<d>.)\k<d>{3,}

引用返信 編集キー/
■25521 / inTopicNo.11)  Re[9]: 正規表現で、且つの記述方法
□投稿者/ Ognac (14回)-(2008/09/21(Sun) 10:09:07)
"(.)\1{9,}([^\1])\2{3,}"
あ! VBで確認してたら、被ってしまった!

引用返信 編集キー/
■25528 / inTopicNo.12)  Re[10]: 正規表現で、且つの記述方法
□投稿者/ も (42回)-(2008/09/21(Sun) 19:13:04)
おお,れい さんOgnac さん,お二人さまありがとうございますm(_ _)m
自分の正規表現解析能力的にものすごく読みづらいのでちょっとずつ理解していきます

# ぜんぜん読めない(orz
引用返信 編集キー/
■25544 / inTopicNo.13)  Re[11]: 正規表現で、且つの記述方法
□投稿者/ たこやき (28回)-(2008/09/22(Mon) 10:52:50)
Ognacさん、れいさん、もさん みなさんありがとうございます。

>Dim pat As String = "(?=.*あい)(?=.*かき)"
こうして教えて頂いてはじめてわかりますが、
自分で考え付くのはむずかしいですね〜 本当にありがとうございました。

>単一の正規表現じゃなく素直にString.indexof()で調べたほうがいいかも.
そうだったんですか。正規表現が検索等に対応した最新の高度な技術なのかと
思っていたもんで、まだ何も知らないもので……。

>今回はString.Containsを使えばいいだけなのでなおさら。
早速に調べたところ、Containsは内部的にindexof()を呼び出しているだけと
ありました。

みなさんのお陰で無事に解決しました。
以下に教えていただいた方法でソースを書いてみました。
問題があったら申し訳ないですが、ご指導お願いいたします。
ありがとうございました。


// 正規表現を用いた、成功例
private void button1_Click(object sender, EventArgs e)
{
string[] rows = { "abc", "cde", "123", "ab12de", "de12ab", "12deab" };

Regex rg = new Regex("(?=.*ab)(?=.*12)");

var aa =
from p in rows
where rg.IsMatch(p.ToString())
select p;

foreach (string a in aa)
Console.WriteLine(a.ToString());
}


// String.Containsを用いた、成功例
private void button1_Click(object sender, EventArgs e)
{
string[] rows =
{ "abc", "cde", "123", "ab12de","de12ab","12deab" };

string [] ss = {"ab","12"};

var aa =
from p in rows
where 文字列の有無(ss,ref p)
select p;

foreach (string a in aa)
Console.WriteLine(a.ToString());
}

bool 文字列の有無(string[] ss, ref string str)
{
for(int i=0; i<ss.Length; i++)
if(!str.Contains(ss[i])) return false;
return true;
}




解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -