正規表現 Part5at TECH
正規表現 Part5 - 暇つぶし2ch750:デフォルトの名無しさん
09/02/19 20:45:50
すいません質問させてください

①/home/test/hoge/test/test.txt
②/home/test/hoge/test/document.txt
↑のパスがありまして、そこからtestで検索をすると
①のtext.txtのみが該当する正規表現ってうまく出来ないものでしょうか?
ファイルまでの途中のパスは含めないで最後のスラッシュ後のファイル名のみ
検索対象としたいのですが悩みまくりです・・・
イメージ的にはエディターでの正規表現で①のみ該当させる感じです。
どなたかご教授願えないでしょうか?

751:デフォルトの名無しさん
09/02/19 20:58:11
C#を使っています
string か strin か stri か str か st か s
にマッチするパターンを今は↓のように書いているんですが
^s(t(r(i(n(g)?)?)?)?)?$
もっと分かりやすい書き方ってありますか?

752:デフォルトの名無しさん
09/02/19 22:42:23
>>750
検索キー 「test.txt」

753:デフォルトの名無しさん
09/02/19 22:44:47
>>750
/([^\/]+\/)*(.*)/ で、\1がパス、\2がファイル名。

754:デフォルトの名無しさん
09/02/19 22:54:31
>>750
秀丸エディタなら↓これでいけた。他は知らん
(?<=.+/)test

755:デフォルトの名無しさん
09/02/19 22:57:56
>>750

test\.txt$

でどうでしょう

756:デフォルトの名無しさん
09/02/19 22:59:13
>>750

少し修正

test\.txt[\r\n$]

757:デフォルトの名無しさん
09/02/19 23:00:16
ひどくなってるYO

758:デフォルトの名無しさん
09/02/20 00:01:43
test\.txt(?=$|\b|[\r\n])

759:デフォルトの名無しさん
09/02/20 02:53:45
YoutubeをダウンロードするFirefoxのuserchrome.jsスクリプトの一部なんだけど
var[ \r\n\t]+swfArgs[ \r\n\t]*=[ \r\n\t]*\{(.*,|)[ \r\n\t]*(t|'t'|"t")[ \r\n\t]*\:[ \r\n\t]*['"]([a-zA-Z\-_0-9]+=)['"].*\}
の(.*,|)の意味するところがわからない。    ↑
|って○○か××を意味するメタ文字じゃないの?なんで)の直前にあるんだろう?

760:デフォルトの名無しさん
09/02/20 03:00:42
(foo|) は (foo)? と同じ意味では。

761:デフォルトの名無しさん
09/02/20 03:13:23
.*0か1個以上ある?じゃあ.+と同じ?

762:デフォルトの名無しさん
09/02/20 08:04:22
はあ?

763:750
09/02/20 08:57:02
みなさんレスありがとうございます
例えが悪かったですが実現したいのはデスクトップの検索エンジンでのファイル名検索でファイル名のみで検索したいのです。
みなさんのレスを参考に思考錯誤してみます

764:デフォルトの名無しさん
09/02/20 20:27:44
>>759
"t": "([^"]+)"
俺は、これで済ませてるw

765:デフォルトの名無しさん
09/02/20 21:39:41
すみません(foo)?の意味がわかりません教えてください

>>764
それでいけるよねw

766:デフォルトの名無しさん
09/02/21 21:02:25
>>751
C#なら
s.Length > 0 && "string".StartsWith(s)
のようにやればいいのに。

767:デフォルトの名無しさん
09/02/23 19:43:45
女のコの性器表現てどれくらいの種類があるんだろう


768:デフォルトの名無しさん
09/02/23 19:56:18
単語だけならともかく、そんなのは文脈によって変わるし、
『×××』だけでもそれを表すことができる上に、『大事なところ』などボカした表現までスコープを広げると
とても現代の正規表現で賄いきれるものではない。
言語学の分野で議論してくるがいい。

769:デフォルトの名無しさん
09/02/24 18:45:51
C#でWBCかワールド・ベースボール・クラシックのどちらかを含み、かつイチローか松坂のどちらかを含むline、と正規表現で
if (Regex.Match(line,"(WBC|ワールド・ベースボール・クラシック) && (イチロー|松坂)").Success)
と書いてみたのですが、いまいちうまくヒットしないです。アドバイスお願いします。


770:デフォルトの名無しさん
09/02/24 20:15:33
正規表現の中に && とか画期的すぎるだろ・・・
テンプレの正規表現講座でも見ておいで

771:751
09/02/24 22:56:03
>>766
確かにその方がわかりやすいですね
ありがとうございます

772:デフォルトの名無しさん
09/02/25 10:58:18
if (Regex.Match(line, "(WBC|ワールド・ベースボール・クラシック)").Success && Regex.Match(line, "(イチロー|松坂)").Success)
でいいんじゃね?C#知らないけど。
AND増えるなら条件を配列に入れてループで。

773:デフォルトの名無しさん
09/02/25 12:46:56
line = "ぽにょワールド・ベースボール・クラシックぽにょイチローぽにょ"

Set RegExp1 = new RegExp
Set RegExp2 = new RegExp
RegExp1.Pattern = "WBC|ワールド・ベースボール・クラシック"
RegExp2.Pattern = "イチロー|松坂"

If RegExp1.Test(line) And RegExp2.Test(line) Then
Wscript.Echo "うんこ"
End If


774:デフォルトの名無しさん
09/02/25 12:49:30
>>772
Regex.Match の使い方が間違ってる。ちゃんと説明書読んだ?

775:デフォルトの名無しさん
09/02/25 14:22:03
C#知らないと言っている人にそんな指摘してもなあ

776:デフォルトの名無しさん
09/02/25 15:22:22
C# カンケーない。Regex.Match の使い方が間違ってる。

777:デフォルトの名無しさん
09/02/25 15:42:59
>>769>>772

if (Regex.Match(line, "WBC|ワールド・ベースボール・クラシック").Success && Regex.Match(line, "イチロー|松坂").Success)

で良いが、IsMatchのほうが良さげ。

if (Regex.IsMatch(line, "WBC|ワールド・ベースボール・クラシック") && Regex.IsMatch(line, "イチロー|松坂"))

778:デフォルトの名無しさん
09/02/27 19:33:25
少しお聞きします。

1hage(100禿)
1hage(10毛)
1hage

という文字列があった場合に、1hage(100禿)以外をマッチさせたいのですが、
なかなかうまくいきません。
どのように正規表現を書いたものでしょうか?


779:778
09/02/27 19:34:25
>>778
すいません。追記です。
具体的には、"hage"をヒットさせたいのですが、"禿"を含むもののみマッチさせないようにしたいのです。

780:デフォルトの名無しさん
09/02/27 19:36:03
1hage にマッチしたものから 1hage(100禿) にマッチするものを取り除く、
じゃダメなのか? どうしても1個の正規表現でやんないとダメ?

781:デフォルトの名無しさん
09/02/27 20:30:52
>>780
うん、やっぱりそれの方がスマートでよいですよね・・・
わかりました。

無理に正規表現だけでやらないとことにします。
ありがとうございました。

782:デフォルトの名無しさん
09/02/28 14:16:03
文章中に「A」と「AA」が混在していて、
1文字だけの「A」を2文字の「AA」にします。
2文字以上連続していない、1文字だけの「A」は
どうやったら探せますか?
/A{1}/ でも駄目ですし、/A[^A]/ だと
行の中に A しかない物が引っ掛かりません。

783:デフォルトの名無しさん
09/02/28 16:40:50
D:\jspsh>jspsh.exe
js> "A AA AAA".replace(/(^|[^A])A([^A]|$)/g, "$1AA$2")
AA AA AAA
js> :q
Leaving "JScript Power Shell"

784:デフォルトの名無しさん
09/02/28 21:51:49
タイ━━||Φ|(|´|Д|`|)|Φ||━━ホ

785:デフォルトの名無しさん
09/02/28 23:10:33
>>783
ありがとう、試してみます。

786:デフォルトの名無しさん
09/03/02 20:45:20
/(?<!A)A(?!A)/

787:デフォルトの名無しさん
09/03/07 00:28:35
<A href="○○○○○○○">●●●●●</a>

<A href="○○○○○○○"><hogehogetag>●●●●●</hogehogetag></a>
という文字列から●●●●●を取り出したいのですが
どうやって書いたら良いか教えてケロ
決まってるのは<A href="○○○○○○○">の次の<>の外の文字列ということです。

788:デフォルトの名無しさん
09/03/07 01:14:08
>>5みたいに書けばいいよ

789:デフォルトの名無しさん
09/03/12 17:29:29
「から最初の」までってどうやって抜き出すんですか?教えてください

790:デフォルトの名無しさん
09/03/12 17:40:07
「[^」]*」

791:デフォルトの名無しさん
09/03/12 17:53:29
ありがとうございました

792:デフォルトの名無しさん
09/03/13 00:14:55
SQL(SELECT、UPDATE、INSERT、DELETEが不明)から、
テーブル名をマッチさせる正規表現が解る方、どなたかいらっしゃらないでしょうか?

ひとつの表現で不可能なら、複数でもいいのですが…(´・ω・`)

793:デフォルトの名無しさん
09/03/13 00:25:51
SQLの構文解析は正規表現じゃ無理

794:デフォルトの名無しさん
09/03/13 01:07:40
金額の文字にマッチするにはどう書けばよいですか?
123,456,789 ←こういうの

795:デフォルトの名無しさん
09/03/13 01:20:24
\d{1,3}(,\d\d\d)* かな

796:デフォルトの名無しさん
09/03/13 08:53:14
複雑な正規表現のテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。


797:デフォルトの名無しさん
09/03/13 08:57:59
製品名を「鼻から悪魔」にしておけば何も問題は無い

798:デフォルトの名無しさん
09/03/13 12:11:43
>>796
私も以前、このスレではない所で同様の質問をしたが、真面目な答えは
返ってこなかったよ。正規表現から見るとプログラムテストは鬼門かもね。


799:デフォルトの名無しさん
09/03/13 12:21:24
複雑なC言語プログラムのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

複雑なjavaのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

複雑なPHPのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

複雑なバッチファイルのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

複雑なExcelマクロのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

・・・正規表現に限った話ではない。

>自分に都合のいいデータだけ作ってやってるけど。
問題の原因がハッキリわかってるじゃないか。それを対処すればいいじゃないか?
自分に都合のいいデータを作ってしまうのが問題なら、他人にデータを作ってもらえばいい。

800:デフォルトの名無しさん
09/03/13 12:42:08
>>796
やったことはないが、本気でやるなら、こんな感じになるんだろう。

1.マッチすべきパターンについて構文木を作る
2.構文木を元に直交表を作る
3.実験計画法でテストケースを作る
4.テストケースをテストプログラム化する


801:デフォルトの名無しさん
09/03/13 14:59:43
>>799
プログラム言語の場合はステップごととか、プロセジャーや
関数に分割してテストするし、型も助けになる。
正規表現の対象としているのは文字列でここから先は構文解析
しかない。複雑な組み込みシステムの入口、出口でどんな
テストデータを用意すればよいかというのと類似した問題だ。

802:デフォルトの名無しさん
09/03/17 13:26:09
URLリンク(www.honya-town.co.jp)
上記のwebページから以下の「マンガホーキング入門」の部分を取り出したいのですがうまくいきません
<tr>
<td bgcolor="#efefef" width="15%" align="center" nowrap><small>
書  名 </small></td>
<td width="85%"><font color="#333399" size="+1"> <strong> マンガホーキング入門 </strong> </font></td>
</tr>

"<strong>(.+?)</strong>"だとここ以外の強調部分もマッチしてしまうので
"書.*?名.+?<strong>(.+?)</strong>"のようにしたのですがこれだとひとつもマッチしてくれません
どのようにするべきなのでしょうか?

803:デフォルトの名無しさん
09/03/17 13:28:20
あれ、書 名 の部分は実際は書&nbsp;&nbsp;名です(&=>&)

804:デフォルトの名無しさん
09/03/17 13:36:57
自己解決しました
「.」は\nを含まないのでだめだったようです
"書.*?名.+?\n.+?<strong>(.+?)</strong>"でいけました
スレ汚しすみませんでした

805:デフォルトの名無しさん
09/03/20 21:51:43
JavaやC#に正規表現のコンパイル機能があるけど、あれって意味あるのかな?
いつも可読性を優先してRegex.Match(data,pattern)みたいに直接使ってるんだけど、
コンパイルが必要になるほど性能が必要な正規表現ってどんなのがあるん?

806:デフォルトの名無しさん
09/03/20 22:00:44
>>805
一般論的に正規表現のコンパイルというと、何度も同じ正規表現を
使うときに差が出る。
それが有意な差になるかはプロファイル取ってみないとわからないけど。

ところで可読性なら生の正規表現よりも定数とかに入れて
名付けた方がいいんじゃない?めんどくさいけど。

807:デフォルトの名無しさん
09/03/20 22:06:30
>>805
perlでo使ったらうれしいときと同じだよ。

808:デフォルトの名無しさん
09/03/20 22:09:58
>>806
>ところで可読性なら生の正規表現よりも定数とかに入れて
>名付けた方がいいんじゃない?めんどくさいけど。

コード体系とかのパースの場合は定数化してるよ。
"Key: Value"なデータのパースとかはハードコードかな。
わざわざファイル移動で確認させる価値もないし。

809:デフォルトの名無しさん
09/03/21 02:47:41
ルールを変更可能にするため外部化、ってのもよくあるパターンだと思うけど。

810:デフォルトの名無しさん
09/03/26 17:50:58
hoge.out.csvを引っ掛けないで、mage.csvやhage.csv
を引っ掛けるにはどう書いたらいいんでしょうか?
.*\.csvを引っ掛けたいのですが、.outが含んでいるときはだめ、という形です。

/[\w\0-9]+(?!\.out)\.csv/
みたいに書いてみたのですが、.out.csvも.csvもともに引っかかってしまいます。

811:デフォルトの名無しさん
09/03/26 18:01:21
>>810

/(?<!\.out)\.csv/

812:810
09/03/26 19:59:19
>>811
ありがとう。

結局こんな感じで行けました。
/^[^\.]*(?!\.out)\.csv/



813:デフォルトの名無しさん
09/03/26 22:41:48
>>812
それ単に.csv以前に「.」を含まないものにマッチだから、

hoge.hoge.csv

はマッチしないけどそれでいいの? .outは含んでないよ。



814:デフォルトの名無しさん
09/03/27 00:05:41
>>812
否定先読みはきちんと理解出来てる?
もう一度パターン眺めてみると良いかも。

815:デフォルトの名無しさん
09/03/29 11:05:44
すみません、似た質問になるのですが
ファイル名が1行の中に列挙されていて
たとえば、hoge1.zip hoge3.zip hoge5.exe のような場合に
行中に .zipでない拡張子が含まれるという条件にマッチする正規表現は可能でしょうか。
ファイル名の区切りは、スペースを仮定します。

816:デフォルトの名無しさん
09/03/29 11:58:50
.+\.(?!zip).{3}

こんな感じ?拡張子は3文字として決め打ちしてるけど。
ファイルとファイルの間にスペースがあるなら、スペースまでのマッチに工夫すれば良いと思うよ。



817:デフォルトの名無しさん
09/03/30 23:57:55
vbsです。
1.txtを\dでマッチさせようとしているのですが、
01がマッチしてしまいます。
a.txtを\Dで待ちさせようとすると
0aがマッチしてしまいます。
どうして2バイトになるのでしょうか?


818:デフォルトの名無しさん
09/03/31 00:30:47
確認方法が間違ってるんじゃね?

819:デフォルトの名無しさん
09/03/31 01:18:23
>>818
そうでした。すみません。

820:デフォルトの名無しさん
09/04/05 23:29:32
●正規表現の使用環境
.NET 1.1 (C#)

●説明
テキストボックスに入力された文字の最後が
大文字小文字関係なく .csv と入力されているか
判断したいです。

if (textBox1.Text.EndsWith(".csv"))
とすると、小文字のcsvでないとTRUEを返してくれません。

.NET2.0以上なら、EndsWith(".csv", 大文字小文字無視)
のように書けるのですが、1.1だとそのメソッドがありません。

恐れ入りますが、ご教授おねがいします。

821:デフォルトの名無しさん
09/04/06 00:04:39
素直な方法が使えないなら、多少は面倒だけど
うしろから4文字を取ってきて、小文字化してから".csv"と比べるとか。

822:デフォルトの名無しさん
09/04/06 00:30:59
>>821
あっ、その方法がありましたね。
自分の頭が固かったです。

文字列を一旦小文字にしてから
比較することで無事解決できました。

どうもありがとうございました。

823:デフォルトの名無しさん
09/04/06 20:31:31
何にもマッチしない正規表現というのは表現可能でしょうか?
どのように記述したものでしょうか?


824:デフォルトの名無しさん
09/04/06 20:34:26
Perl正規表現雑技
URLリンク(www.din.or.jp)

ここにありました。

 (?!)

こんな簡単なのでいいんですね

825:デフォルトの名無しさん
09/04/06 20:52:58
否定先読みで全ての要素を否定してるから、何にもマッチしないって事だね。
良いんでない?

826:デフォルトの名無しさん
09/04/07 14:27:36
/xxx/sss/ccc/fff/ggg/aaa.txt

と言う感じで任意の回数スラッシュが出てくるんですが、一番最後のスラッシュ
だけをsedで "/"→"/tmp/"に置き換えたいんです。

正規表現を使って置換可能でしょうか?記述が全く思いつきません、、、



827:デフォルトの名無しさん
09/04/07 14:53:02
>>826
s/(\/[^/]+)$/\/tmp\1/g

828:デフォルトの名無しさん
09/04/07 14:53:15
>>826
s:/[^/]*$:/tmp&:

829:デフォルトの名無しさん
09/04/07 21:32:38
否定先読みでマッチさせてもいいかもね。

830:デフォルトの名無しさん
09/04/07 22:56:23
というか、一番最後のスラッシュっていう条件はまだ甘い方だと思うんだけど。
全く思いつかないってのは単に勉強不足じゃない?

831:826
09/04/08 00:19:51
>>827-830
色々アドバイスありがとうございます。
828氏の記述で期待通りの処理が出来ました。

>>830
すみません、仰るとおりで。
書いた後色々グググって、IBMのページ

URLリンク(www.ibm.com)

の"円記号付き括弧"を参考にした漏れなりの解↓

's/\(.*\)\/\(.*\)/\1\/tmp\/\2/g'

自分で書いておきながら、何でこれが一番最後のスラッシュにマッチするのか
よく分かってない('A`


832:デフォルトの名無しさん
09/04/08 01:04:48
マッチっていう意味ならスラッシュのある一行全体にマッチしてる。
で、最初の括弧が\1、次の括弧が\2としてマッチ。

というか\2の辺り削ってもいいんじゃないかと。

s/(.*)\//\1\/tmp\//g

833:826
09/04/08 01:26:34
>>832
いや、分からないのは、's/\(.*\)\/\(.*\)/\1\/tmp\/\2/g' この表現で何故

aaa/tmp/bbb/ccc/ddd/eee/fff.txt

とならずに

aaa/bbb/ccc/ddd/eee/tmp/fff.txt

と、一番最後のスラッシュが対象になるのかなぁ、と。


834:デフォルトの名無しさん
09/04/08 01:44:41
bregonig.dllのバグとおもう。デミリタを換えると関数が失敗してる。
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
typedef struct bregexp { const char *outp; const char *outendp; int splitctr; const char **splitp; int rsv1; char *parap; char *paraendp; char *transtblp; char **startp; char **endp; int nparens; } BREGEXP;
typedef int (WINAPI *fa)(char * , char * , char * , BREGEXP ** , char *);
typedef void (WINAPI *fb)(BREGEXP *);

main(){
char bunsyo[26]="abcdefghijklmnopqrstuvwxyz";
char findstr[]={0xA5, 0xEA}, *p, msg[80];

HINSTANCE hd = LoadLibrary("bregonig.dll");
fa BMatch = (fa)GetProcAddress(hd,"BMatch");
fb BRegfree = (fb)GetProcAddress(hd,"BRegfree");

string str = "m/" + (string)findstr + "/i";
char c=47; str[1]=str[28]=c;
{ BREGEXP *rxp = NULL;
if( BMatch( &str[0], bunsyo, bunsyo+26, &rxp, msg) )
{ cout<<"Hit "; p=(rxp->startp[0]); } else cout<<"NoHit ";
BRegfree(rxp); }
cout<<"デミリタ "<< c <<" は通る\n";

c=1; str[1]=str[28]=c;
{ BREGEXP *rxp = NULL;
if( BMatch( &str[0], bunsyo, bunsyo+26, &rxp, msg) )
{ cout<<"Hit "; p=(rxp->startp[0]); } else cout<<"NoHit ";
BRegfree(rxp); }
cout<<"デミリタ "<< c <<" は通る\n";
}

835:834の修正。 これが動作しません
09/04/08 02:11:11
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;

typedef struct bregexp { const char *outp; const char *outendp; int splitctr; const char **splitp; int rsv1; char *parap; char *paraendp; char *transtblp; char **startp; char **endp; int nparens; } BREGEXP;
typedef int (WINAPI *fa)(char * , char * , char * , BREGEXP ** , char *);
typedef void (WINAPI *fb)(BREGEXP *);

main(){
char bunsyo[7]="abcdef/";
char findstr[4]={0x2F, 0xA5, 0xEA, 0}, *p, msg[80];

HINSTANCE hd = LoadLibrary("bregonig.dll");
fa BMatch = (fa)GetProcAddress(hd,"BMatch");
fb BRegfree = (fb)GetProcAddress(hd,"BRegfree");


string str=(string)"m/" + (string)findstr + (string)"/i";

char c='/'; str[1]=str[9]=c;
{ BREGEXP *rxp = NULL;
if( BMatch( &str[0], bunsyo, bunsyo+7, &rxp, msg) ) { cout<<"Hit "; p=(rxp->startp[0]); } else cout<<"NoHit ";
BRegfree(rxp); }
cout<<"デミリタ "<< c <<" は通る\n";

c='*'; str[1]=str[9]=c;
{ BREGEXP *rxp = NULL;
if( BMatch( &str[0], bunsyo, bunsyo+7, &rxp, msg) ) { cout<<"Hit "; p=(rxp->startp[0]); } else cout<<"NoHit ";
BRegfree(rxp); }
cout<<"デミリタ "<< c <<" は通る\n"; }

836:デフォルトの名無しさん
09/04/08 02:14:16
検索しようとする文字列に、特定の文字が含まれている場合、
デミリタを「/」以外にするとバグるようなんです。
しかし、検索しようとする文字に「/」が含まれている場合は別のデミリタを使うしか無く困ります。

837:デフォルトの名無しさん
09/04/08 02:40:05
サクラエディタで検索してもバグらないし、ソースコードみても回避方法わからなかった

838:デフォルトの名無しさん
09/04/08 04:20:23
>>833
最大マッチと最小マッチの差じゃない?
sedは知らんけど

839:836
09/04/08 04:27:12
次の文字でバグりました。
40 41 42 43 63 91 92 129
EUC全角カタカナ「リ」

840:デフォルトの名無しさん
09/04/08 04:39:05
そりゃエスケープせんと。例えばasciiの40って、'('じゃないか。

841:836
09/04/08 05:14:28
特殊文字はわかりました。しかし「リ」を含む文字でも間違えるんです。
検索対象には含まれていないのに、含まれているとなるんです。

842:デフォルトの名無しさん
09/04/08 06:55:23
どう間違えているか判らんが、cp932対応のエンジンにeucを食わせたらそりゃぁ、混同するさ。

843:836
09/04/08 08:09:39
BREGEXPってバイナリの正規表現が出来るとおもってた。
Bは馬場さんのBでバイナリではなかったのか。

844:836
09/04/08 08:16:09
書いてありました。


5.制限事項・注意事項

 Oniguruma 自体は各種文字エンコーディングに対応していますが、
bregonig.dll は Bregexp.dll との互換性のため、ASCII と Shift_JIS 以
外の文字エンコーディングは使用できません。

845:鬼車を弄くった。これで任意の文字でいけるだろうか
09/04/08 10:14:16
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
#include "oniguruma.h"
#pragma comment(lib, "onig.lib")

char *Bfind(char *start,char *end, string ptn, int *size){
int r; regex_t* reg; OnigErrorInfo einfo; char *p=NULL; *size=0;
r = onig_new(®, (UChar*)&ptn[0], (UChar*)&ptn[ptn.size()] ,ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT, &einfo);
if (r != ONIG_NORMAL) return NULL;
OnigRegion *region = onig_region_new();
r = onig_search(reg, (UChar*)start, (UChar*)end, (UChar*)start, (UChar*)end, region, ONIG_OPTION_NONE);
if (r >= 0) { *size=region->end[0]-region->beg[0]; p= start+r; }
onig_region_free(region, 1 ); onig_free(reg); onig_end(); return p; }

char *Bpick(char *start, char *end, string ptn, string &str){
int r; regex_t* reg; OnigErrorInfo einfo; char *p=NULL; str=""; int size;
r = onig_new(®, (UChar*)&ptn[0], (UChar*)&ptn[ptn.size()] ,ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT, &einfo);
if (r != ONIG_NORMAL) return NULL;
OnigRegion *region = onig_region_new();
r = onig_search(reg, (UChar*)start, (UChar*)end, (UChar*)start, (UChar*)end, region, ONIG_OPTION_NONE);
if (r >= 0) {
if(region->num_regs==1){p=start + region->beg[0]; size=(region->end[0]-region->beg[0]); }
else { p=start + region->beg[1]; size=(region->end[1]-region->beg[1]); }
str.resize(size); memcpy(&str[0],p,size) ;}
onig_region_free(region, 1 ); onig_free(reg); onig_end(); return p; }

main(){
char x[]="zzzzaffffffffb"; string s,ptn;
ptn="a.*b"; Bpick(x, x+strlen(x), ptn, s); cout<<s<<endl;
ptn="a(.*)b"; Bpick(x, x+strlen(x), ptn, s); cout<<s<<endl; }

846:デフォルトの名無しさん
09/04/08 10:37:09
845だと多バイト文字は識別しないはずなので、バイナリ文字列の正規表現がいけるはずです。
うちの環境ではEUCの文字でバグっていたところも問題でなくなりました。
Bfindは、ptnを検索して、見つかった先頭アドレスを返します。
Bpickは、正規表現にマッチした文字列をstrにセットします。

847:デフォルトの名無しさん
09/04/08 23:31:24
>>839
>EUC全角カタカナ「リ」
2バイト目は0xEAだから、Shift_JISの1バイト目として解釈されてその次の1バイトが
デリミタとして扱われていない。
そういう変なバイト列を検索したいのなら、\xHH形式を使えば?
findstr="\\x2F\\xA5\\xEA";

848:デフォルトの名無しさん
09/04/09 02:09:32
そういうことか 納得

849:デフォルトの名無しさん
09/04/09 08:10:26
ホスト名を抜き出したいです。例えば、

URLリンク(goo.ne.jp)<)
↓↓↓↓↓↓↓↓↓↓
goo.ne.jp
google.com

としたいです。

850:デフォルトの名無しさん
09/04/09 08:26:40
スレ違いです

851:デフォルトの名無しさん
09/04/09 09:33:07
>>849
URLだかURIのRFCに正規表現がそのまま載ってた覚えがあるぞ。


852:デフォルトの名無しさん
09/04/09 10:00:37
http://([^/]+)
\1
でいいだろ

853:デフォルトの名無しさん
09/04/11 13:51:18
はあ?

854:デフォルトの名無しさん
09/04/11 14:28:59
h?http://([^/]+).* \r

$1 \r

855:デフォルトの名無しさん
09/04/11 14:31:31
>>849
“ホスト名”の定義があいまい
トップページへのアクセス先を取りたいということの場合に
sub.example.jpに対してトップはexample.jpではなくmain.example.jpだったら?

FQDNを抜き出すということなら自分はこうする
([^:/]+)(?=\/)

856:855
09/04/11 14:33:51
先頭に://と@の扱い入れるの忘れたや

857:デフォルトの名無しさん
09/04/11 23:42:47
ポートの事も、たまには思い出してください。

858:デフォルトの名無しさん
09/04/12 05:52:12
法令の条文の漢数字を算用数字に置換する正規表現を教えてください。

たとえば、

第一条    → 第1条

第十一条   → 第11条

第三十四条  → 第34条

第百条    → 第100条

第百二十三条 → 第123条

第三百二条  → 第302条

第千三条   → 第1003条

第千二十三条 → 第1023条

等です。ついでに、

第二百五十六条の二   → 第256条の2

第二百五十六条の二の一 → 第256条の2の1

なんかも置換できれば大変うれしいです

よろしくお願いします。


859:デフォルトの名無しさん
09/04/12 07:57:41
そりゃ正規表現だけじゃ無理だべ。
なんらかの言語の支援がないと。

860:デフォルトの名無しさん
09/04/12 09:33:59
「なんば君」HELP で検索。

861:デフォルトの名無しさん
09/04/12 12:40:41
なんで正規表現でやりたがるのか理解できない

862:デフォルトの名無しさん
09/04/13 00:18:11
魔法の呪文
正規表現

863:デフォルトの名無しさん
09/04/13 02:00:53
>>861 「なんで」うんぬん

たとえば、テキスト・ファイル中に

「まったく正規表現とは関係ないが、民事訴訟法第123条第2項は美しい!」

とかあった場合に、その行にカーソルをおいて特定のキーを押せば、
民事訴訟法第123条第2項の条文がポップ・アップで表示できるEmEditorの(Javascriptもどきの)
マクロを作って使用しているのですが、模範六法のCD等から落としたファイルの条文は
算用数字なのに、Webページで公開されている条文のなかには漢数字のものが多いので、
それを利用したいな、なんて思ったたわけです。

貴兄たちの異常な才能を信じてお願いしてみました。






864:デフォルトの名無しさん
09/04/13 02:06:18
そういう意味の「なんで」じゃ無いやろw

865:デフォルトの名無しさん
09/04/13 02:07:07
>>863
それは貴方の求める機能の目的であって、
そこに正規表現を使う理由にはならないでしょう?
およそ正規表現が引き合いに出されるような要求では無いように思いますが。

866:デフォルトの名無しさん
09/04/13 02:27:08
>>865

私が作ったマクロが正規表現で条項の検索をしているので、
そこのところを置き換えるだけですめばわたしにとって便利だ
という、たんなる自己中理由でした。

みなさんに不愉快な思いをさせたみたいですみません。



867:デフォルトの名無しさん
09/04/13 04:36:09
だから、何故正規表現云々の前に自分の環境を提示しないの? 馬鹿なの? 日本語学習中なの?

868:デフォルトの名無しさん
09/04/13 06:03:19
第三者だが、>>867は分かりにくいぞ。
>>863にEmEditorのマクロでと記載してあるが。

869:デフォルトの名無しさん
09/04/13 09:09:22
EmEditorのことは全然わからないけど
その Javascriptもどき ってヤツでプログラミングすればいいんじゃないの?

こんなのがあるけど参考になるかな・・・
URLリンク(d.hatena.ne.jp)

870:デフォルトの名無しさん
09/04/13 09:11:53
おっと、Javascript 版みっけ!
URLリンク(blog.livedoor.jp)

871:デフォルトの名無しさん
09/04/13 09:14:41
ついでに Excel
URLリンク(www.windows-world.jp)

872:デフォルトの名無しさん
09/04/13 22:44:12
●正規表現の使用環境
Flexible Renamer(Perl5互換)

●検索か置換か?
置換

●説明

サクラエディタでNCプログラムの編集をしています
可能かどうかわかりませんが以下のような形式で
Nの後の番号を振り直すというのはできるでしょうか?


●対象データ
N10 ABC
N10 DEF
N30 GHI
N100 JKL
N50 MNO

●希望する結果

N10 ABC
N20 DEF
N30 GHI
N40 JKL
N50 MNO

873:デフォルトの名無しさん
09/04/13 23:08:53
そういうのは正規表現の仕事ではありません

874:872
09/04/13 23:22:10
>>873
了解です、できないと事がわかったので感謝します

875:デフォルトの名無しさん
09/04/14 01:36:46
たしかに
....replace(/^N\d+/, "N" + n); n += 10;
のようにやるよりは
{ $1 = "N" (10 * NR); print }
の感じのほうがいいな。

876:taguti
09/04/14 14:41:40
6個のreal型変数x1、y1、x2、y2、x3、y3を定義しそれぞれに実数つを読み込んで、xy平面上の3点
(x1、y1)(x2、y2)(x3、y3)を頂点に持つ三角形の面積を計算して、その値を表示するプログラムを作成してください。
・公式:底辺x高さ÷2を使って計算してください。
お願いします!!



877:デフォルトの名無しさん
09/04/14 14:47:38
それを正規表現でやるのか

878:デフォルトの名無しさん
09/04/14 16:15:56
包茎が治る正規表現を教えてください。
先っぽの皮が余ってしょうがないんです。
お願いします!!

879:デフォルトの名無しさん
09/04/14 22:41:17
>>876
これはひどいwww
ここまで来ると逆に尊敬するマルチ野郎だな。
スレリンク(tech板:493番)
スレリンク(tech板:770番)
スレリンク(tech板:499番)
スレリンク(tech板:774番)
スレリンク(tech板:876番)
スレリンク(tech板:66番)
スレリンク(tech板:499番)
スレリンク(tech板:808番)
スレリンク(tech板:821番)
スレリンク(tech板:16番)
スレリンク(tech板:934番)
良識を疑うよ。


880:デフォルトの名無しさん
09/04/14 22:54:02
>>879
すれ違いだけど
俺もそれ学校の問題で出されたことある。
定番かな。構造体使うC言語の問題で。
はっきりいって、三角形の公式使わないほうが楽だよね。
一点を原点移動して例の公式を適用するのが一番シンプルだと思う。

881:デフォルトの名無しさん
09/04/15 18:25:02
>>876
ヘロンの定理でググれカス。

882:デフォルトの名無しさん
09/04/15 20:12:01
>>881
不覚にも

883:デフォルトの名無しさん
09/04/16 00:50:48
何と戦ってるんだろう

884:デフォルトの名無しさん
09/04/16 12:31:02
>>879
そんな事より
答え書けよ!

885:デフォルトの名無しさん
09/04/16 13:25:44
>>881
ヘロンの定理
イラナイだろ
とんち問題だよ

886:デフォルトの名無しさん
09/04/16 13:39:16
>>880 >>881
ヘロンの定理で良いから
プロ書いてみたら


887:デフォルトの名無しさん
09/04/16 13:58:24
いや、どう考えてもプログラミングしてくれってのがおかしいだろ。
正規表現のスレで出る話題じゃない。

888:デフォルトの名無しさん
09/04/16 14:04:39
#include <stdio.h>
#include <math.h>
int main(void)
{
double x1, y1, x2, y2, x3, y3;
double a, b, c, s, S;
#define INPUT(x) printf(#x ": "); scanf("%lf", &x)
INPUT(x1); INPUT(y1);
INPUT(x2); INPUT(y2);
INPUT(x3); INPUT(y3);
a = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
b = sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));
c = sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));
s = (a + b + c) / 2.0;
S = sqrt(s * (s - a) * (s - b) * (s - c));
printf("三角形の面積は %lg\n", S);
return 0;
}

889:デフォルトの名無しさん
09/04/16 19:48:18
ヘロンの公式キターーー

890:デフォルトの名無しさん
09/04/16 20:06:18
>>888
こういう一見親切そうな行動をする人間が、世の中のすべてを駄目にする。

891:デフォルトの名無しさん
09/04/16 20:26:15
ヘロンの公式とかこの問題を解くのにふさわしくない

892:デフォルトの名無しさん
09/04/16 20:36:33
>>891
照合するのに使う

893:デフォルトの名無しさん
09/04/16 20:38:14
>>890
お舞いも
書いてみたら

894:デフォルトの名無しさん
09/04/16 20:56:34
性器表現できません><

895:デフォルトの名無しさん
09/04/16 21:54:39
行列式でも出るよ
さあ誰か書け

896:デフォルトの名無しさん
09/04/16 22:04:04
↑お麻衣が書くニダ

897:デフォルトの名無しさん
09/04/16 22:17:53
>>876
>それぞれに実数つを読み込んで

ココ
とても難しい
どこから?
どうやって?

それで
乱数で与えてみる

898:デフォルトの名無しさん
09/04/16 22:44:34
ヘロン公式は
√を使うから
誤差はどう?

899:デフォルトの名無しさん
09/04/16 22:49:03
JavaScriptが動く HTML実験部屋
URLリンク(homepage2.nifty.com)


900:デフォルトの名無しさん
09/04/16 23:01:38
<center><script> var x1, y1, x2, y2, x3, y3; var a, b, c, s, S; var S1,S2,M,N;
/*倍率*/ M=100000000;
/*回数*/ N=1000;
document.write('<style>td,th{font-size:10;}</style><table border=1><tr>');
document.write('<th>x1</th><th>y1</th><th>x2</th><th>y2</th><th>x3</th><th>y3</th>');
document.write('<th>底辺x高さ÷2公式<br>による面積計算結果</th>');
document.write('<th>ヘロン公式による<br>√を使った面積計算結果</th>');
document.write('<th>問題となる誤差<br>倍率'+M+'倍</th></tr>');

for(i=0;N>i;i++){ // 数値を自動代入
x1=(Math.random()*2-1)*M; y1=(Math.random()*2-1)*M;
x2=(Math.random()*2-1)*M; y2=(Math.random()*2-1)*M;
x3=(Math.random()*2-1)*M; y3=(Math.random()*2-1)*M;

a=Math.abs(x1-x2)*Math.abs(y1-y2)/2; // 底辺x高さ÷2公式による面積の計算
b=Math.abs(x2-x3)*Math.abs(y2-y3)/2;
c=Math.abs(x3-x1)*Math.abs(y3-y1)/2;
s=(Math.max(Math.max(x1,x2),x3)-Math.min(Math.min(x1,x2),x3))
s*=(Math.max(Math.max(y1,y2),y3)-Math.min(Math.min(y1,y2),y3)); S=s-a-b-c; S1=S;

a = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); // ヘロン公式による√を使った面積の計算
b = Math.sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));
c = Math.sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));
s = (a + b + c) / 2.0; S = Math.sqrt(s * (s - a) * (s - b) * (s - c)); S2=S;

document.write('<tr><td> '+x1+'</td><td> '+y1+'</td>'); // 計算結果と誤差を表示
document.write('<td> '+x2+'</td><td> '+y2+'</td><td> '+x3+'</td><td> '+y3+'</td>');
document.write('<td> '+S1+'</td><td> '+S2+'</td><td> '+(S1-S2)+'</td></tr>');
}document.write('</table>');
</script>


901:デフォルトの名無しさん
09/04/16 23:02:20
>>888 >>900>>899

902:デフォルトの名無しさん
09/04/16 23:13:33
/*倍率*/ M=1000; // 変更

903:デフォルトの名無しさん
09/04/16 23:20:59
言語Perlです。

あるCのソースから構造体(typedefも)を抽出したいのですが、
この例のようなstructやunionを含んでるstructを
マッチさせるにはどう書けばいいんですか?

struct A{
  unsigned short a;
  unsigned long b
  char*      c;
  struct{
   long e[8];
   long f;
  }d;
};



904:デフォルトの名無しさん
09/04/16 23:24:21
↑一旦文字変換してから
matchさせると良い

905:デフォルトの名無しさん
09/04/16 23:29:33
-21761253.57183114  8544355.772346469  61664545.39556769  62137654.31616132  79934094.82325418  66218011.1129441  659766221291321.5  319359195447661.56  340407025843659.94

906:デフォルトの名無しさん
09/04/16 23:47:31
たとえば?

data=list*->A.c;
if(data.match(/.*/)){

}

907:デフォルトの名無しさん
09/04/16 23:48:55
x=(79934094.82325418)-(-21761253.57183114);
y=(66218011.1129441)-(8544355.772346469);

908:デフォルトの名無しさん
09/04/17 00:15:56
>>903
>この例のようなstructやunionを含んでるstructを
一般に、任意にネストできる構造は正規表現で照合できない
(実は、「Perlの」正規表現ではできてしまうけど、ごちゃごちゃしたものになるので
オススメしない)。正確に抽出したいならCのパーザを自前で書くか、どっかからCのパーザ
拾ってくるのが良い

909:デフォルトの名無しさん
09/04/17 00:22:26
簡単な検証方法
<center><script> var x1, y1, x2, y2, x3, y3; var a, b, c, s, S; var S1,S2,M,N;
/*可変*/ N=1000;
document.write('<style>td,th{font-size:10;} </style><table border=1><tr>');
document.write('<th>x1 </th><th>y1 </th><th>x2 </th><th>y2 </th><th>x3 </th><th>y3 </th>');
document.write('<th>底辺x高さ÷2公式<br>による面積計算結果 </th>');
document.write('<th>ヘロン公式による<br>√を使った面積計算結果 </th>');
document.write('<th>問題となる誤差<br>倍率'+M+'倍 </th> </tr>');

for(i=-N;N>=i;i++){ // 数値を自動代入
x1=0; y1=i;
x2=-1; y2=0;
x3=1; y3=0;

a=Math.abs(x1-x2)*Math.abs(y1-y2); // 底辺x高さ÷2公式による面積の計算
b=Math.abs(x2-x3)*Math.abs(y2-y3);
c=Math.abs(x3-x1)*Math.abs(y3-y1);
s=(Math.max(Math.max(x1,x2),x3)-Math.min(Math.min(x1,x2),x3))
s*=(Math.max(Math.max(y1,y2),y3)-Math.min(Math.min(y1,y2),y3)); S=s-(a+b+c)/2; S1=S;

a = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); // ヘロン公式による√を使った面積の計算
b = Math.sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));
c = Math.sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));
s = (a + b + c) / 2.0; S = Math.sqrt(s * (s - a) * (s - b) * (s - c)); S2=S;

document.write('<tr><td> '+x1+' </td><td> '+y1+' </td>'); // 計算結果と誤差を表示
document.write('<td> '+x2+' </td><td> '+y2+' </td><td> '+x3+' </td><td> '+y3+' </td>');
document.write('<td> '+S1+' </td><td> '+S2+' </td><td> '+(S1-S2)+' </td> </tr>');
}document.write(' </table>');
</script>


910:デフォルトの名無しさん
09/04/17 00:28:10
誤差を検証してみた
その結果√を使用すると
誤差が大きいと判断される

>>909>>900>>888

JavaScriptが動く HTML実験部屋
URLリンク(homepage2.nifty.com)


911:デフォルトの名無しさん
09/04/17 00:44:36
perl5.8.8を使用しています。

<td>タグの中身を取得したいのですが、ネストしている場合は、
内側のタグのみを対象としたいです。

そこで否定先読みで<td>と</td>の間の文字列でかつ、"<td>"に続かない
ものにマッチするという正規表現を書こうとしています。

現状では以下のような感じです。

$_ =<<DATA;
<td>データ1</td>
<td>
<tr>
<td>データ2</td>
</tr>
</td>
DATA

# 内側のテーブルタグのみにマッチさせたい
@res = /<td>(?![\s\w<>]+?<td>)[\s\S]+?<\/td>/gm; # こっちはOK
#@res = /<td>(?![\s\S]+?<td>)[\s\S]+?<\/td>/gm; # NG

分からないのはNGと書いた方が上手く動かない理由です。
現象としては、否定先読み条件の中の最短マッチが適用されていないように思います。
上の例ですと、データ2のみが取得されてしまいます。

修正方法を教えていただけないでしょうか。

912:デフォルトの名無しさん
09/04/17 02:14:58

[\s\S]って
.
と同じ?


913:デフォルトの名無しさん
09/04/17 02:36:13
>>911>>910  サンプル
<center><script> var x1, y1, x2, y2, x3, y3; var a, b, c, s, S; var S1,S2,M,N;
/*可変*/ N=1000; P='';
P+=('<style>td,th{font-size:10;} </style><table border=1><tr>');
P+=('<th>x1 </th><th>y1 </th><th>x2 </th><th>y2 </th><th>x3 </th><th>y3 </th>');
P+=('<th>底辺x高さ÷2公式<br>による面積計算結果 </th>');
P+=('<th>ヘロン公式による<br>√を使った面積計算結果 </th>');
P+=('<th>問題となる誤差<br>倍率'+M+'倍 </th> </tr>');

for(i=-N;N>=i;i++){ // 数値を自動代入
x1=0; y1=i;
x2=-1; y2=0;
x3=1; y3=0;

a=Math.abs(x1-x2)*Math.abs(y1-y2); // 底辺x高さ÷2公式による面積の計算
b=Math.abs(x2-x3)*Math.abs(y2-y3);
c=Math.abs(x3-x1)*Math.abs(y3-y1);
s=(Math.max(Math.max(x1,x2),x3)-Math.min(Math.min(x1,x2),x3))
s*=(Math.max(Math.max(y1,y2),y3)-Math.min(Math.min(y1,y2),y3)); S=s-(a+b+c)/2; S1=S;

a = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); // ヘロン公式による√を使った面積の計算
b = Math.sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));
c = Math.sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));
s = (a + b + c) / 2.0; S = Math.sqrt(s * (s - a) * (s - b) * (s - c)); S2=S;

P+=('<tr><td> '+x1+' </td><td> '+y1+' </td>'); // 計算結果と誤差を表示
P+=('<td> '+x2+' </td><td> '+y2+' </td><td> '+x3+' </td><td> '+y3+' </td>');
P+=('<td> '+S1+' </td><td> '+S2+' </td><td> '+(S1-S2)+' </td></tr>');}P+=('</table>');

data=P; data=data.replace(/(<td>)([^<>]*)(<\/td>)/g,'$1 消去$3'); document.write(data);
</script>


914:デフォルトの名無しさん
09/04/17 02:37:52
>>911
これを参考に・・・

data=data.replace(/(<td>)([^<>]*)(<\/td>)/g,'$1消去$3');

915:デフォルトの名無しさん
09/04/17 02:51:50
>>895
せっかく>>876を行列式で書くなら
3D空間で同様に書いてみたら?
つまり宇宙的規模と言う事です。

(x1,y1,z1) (x2,y2,z2) (x3,y3,z3)


916:デフォルトの名無しさん
09/04/17 02:54:13
↑2Dサンプルは>>910参照

917:デフォルトの名無しさん
09/04/17 03:08:46
>>912

同じといえば同じ。
ただし、. と違って常に改行にもマッチする。

否定形で使うと何ともマッチすることのないものになる。




最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch