1 :
デフォルトの名無しさん :
2011/03/26(土) 00:38:06.48
スルーされにくい質問のテンプレと例 ●正規表現の使用環境 Java1.5 ●検索か置換か? 検索 ●説明 各行の1番目のAまでを検索したい ●対象データ ABCA BCAA CABA ●希望する結果 ABCA ^ BCAA ^^^ CABA ^^
5 :
デフォルトの名無しさん :2011/03/26(土) 13:27:53.72
乙
この勢いだとdat落ちしそうだな
どなたかご教授ください・・・ ●正規表現の使用環境 EmEditor ●検索か置換か? 置換 ●説明 鍵カッコ内の文字列と前方の文字列を入れ替えたい。 ●対象データ AAA「BBB」/CCC「DDD」/EEE「FFF」…YYY「ZZZ」 ●希望する結果 BBB「AAA」/DDD「CCC」/FFF「EEE」…ZZZ「YYY」
>>9 試してないけど
検索: ([^「」/]+)「([^」]+)」
置換: \2「\1」
●正規表現の使用環境 秀丸(複数行置換) ●検索か置換か? 置換 ●説明 上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ 変更したいです。 ●対象データ name=Relative color=#000000 style=0 ●希望する結果 name=Relative color=#000000 style=2 ******************************************** 下のようにnameとcolorは値が変わるので.*としているのですが、 置換文の置換時に変更しないという書き方が分かりません。 分かる方おりましたら教えて下さいませ。 [検索条件] name=.* color=.* style=0 [置換文] name= color= style=2
検索 name=(.*)\ncolor=(.*)\nstyle=0 置換 name=\1\ncolor=\2\nstyle=2
>>13 無事出来ました、どうもありがとうございます!
Excelの置換で、 マッチした文字列を、マッチした文字列の最初の一文字で置換したいです。 たとえば、 りんご ごりら ぼーる だと、 り ご ぼ に置換したいです。 置換前の正規表現と、置換後の正規表現はどのようにすればよいのでしょうか?
最近のExcelって正規表現で検索・置換ができるようになったの?
>>16 アドオンみたいなのでいけるようになります。
検索 (.).* 置換 \1
繰り返しの処理は分かるので正規表現の書き方を教えて頂きたいです。 よろしくお願いします。 ●正規表現の使用環境 VB.NET2003 ●検索か置換か? 検索 ●説明 果物の名前を検索したい ●対象データ 箱の色・箱A/緑、箱B/橙、箱C/黄、箱D/赤 箱の中身・箱A/メロン、箱B/みかん、箱C/バナナ、箱D/りんご 箱の大きさ・箱A/100cm、箱B/120cm、箱C/140cm、箱D/160cm ●希望する結果 メロン みかん バナナ りんご
メロン|みかん|バナナ|りんご
21 :
デフォルトの名無しさん :2011/04/14(木) 23:47:33.90
●正規表現の使用環境 C#.Net ●検索か置換か? 検索 ●対象データ data (data data) (data) Xdata dataY ●希望する結果 data dataが()XY以外と隣接している場合は検索を一致させたくないのですが、 それが中々できません。 よろしくお願いします。
25 :
24 :2011/04/16(土) 17:12:20.27
すいません、追記です。 dataの部分をグループにまとめたいです
思いついたのをそのまま書いたらすげー長くなってしまった ((?<=[()XY])data|data(?=[()XY])|(?<=[()XY])data(?=[()XY])) 一番上のdataも含めるなら ((?<=[()XY])data|data(?=[()XY])|(?<=[()XY])data(?=[()XY])|^data$) 追記はよくわからん
^(data)$ とは違うのか?
最初はそれかと思った。でも >()XY以外と隣接している場合は検索を一致させたくない ということなので()XYに隣接してるdataが引っかかるようにしといた
皆さんありがとうございます。
現在出先なのでまだ確認できませんが、家に帰ったらやてみようと思います。
>>28 data
(data
dataY
などは一致させたいのですが、
bigdata
などは一致させたくないのです
分かりづらくてすいません
V2Cとか正規表現を使える2ch専ブラってマジ便利すぎるな。
正規表現でとあるスレの、特定のURLを含まないレスをあぼーんにしたいと考えています 特定のURLは"mt=8"と"hibari"が含まれたURLです [^(mt=8)(hibari)] と試しましたが駄目でした。どのようにすればよいのでしょうか?
mt=8とhibariを含まないURLにマッチでいいんだよね? ^((?<!mt=8).(?!mt=8))*$ ^((?<!hibari).(?!hibari))*$ 正規表現を複数登録できるならこの2つでいける なんとか1つにまとめようとしたんだけど無理だったわ。 1つにまとめれる人いたらやり方教えて
>>32 二つを併用しようとしたら全部のレスが消えてしまったのですが、上の
^((?<!mt=8).(?!mt=8))*$
だけでも絶大な効果だったので下のは諦めることにします
有難うございました!
>>31 ,32
(Perl正規表現雑技を見ながら)
両方の文字列を共に含まないなら
^(?:(?!mt=8.*hibari)(?!hibari.*mt=8).)*$
どちらか一方でも含まないなら
^(?:(?!mt=8)(?!hibari).)*$
でいけるっぽい
35 :
32 :2011/04/17(日) 21:28:07.66
>>34 量指定子って先後読みには使えないと思ってたけど
使えないのは後読みだけなのか。間違って覚えてた
先後読み両方使うより先読みだけのほうがスマートだな
勉強になった。ありがとう
>>34 おお、下の
^(?:(?!mt=8)(?!hibari).)*$
で望み通りになりました
>>34-35 本当に有難うございます!
37 :
24 :2011/04/18(月) 21:16:19.92
>>26 ようやく自宅のPCを付けて確認することができました。
ありがとうございます。
私が望んでいた動きができました!
38 :
デフォルトの名無しさん :2011/04/19(火) 02:20:36.99
>>22-23 [^/]でいけました
ありがとうございましたm(_ _)m
Windowsなんですが、 C:\work\20110410dsk30.jpg C:\work\2011419100002.jpg D:\My Pictures\保存画像\カレイドスター\e2498f54.jpg D:\My Pictures\保存画像\プリキュア\03cde8e1.jpg D:\My Pictures\保存画像\プリキュア\10mai458354.jpg こう言うフルパスからファイル名だけ抜き出したいのですが、「.*\\」とすると最後の10mai458354.jpgだけしか残りません。 どうすれば、1行毎に、行頭からその行の最後の\記号までを指定できるのですか?
ロゼッタの画像うpしてくれたらがんばって答える それはともかく使ってる処理系かエディタの名前書いたほうがいいよ バックスラッシュがややこしい
ロゼッタって誰? バックスラッシュがややこしいとは?
円記号
>>43 どう考えてもURLからしてロゼッタストーンです
本当にありがとうございました
>>42 うーん…
ピリオドが一文字を表してて、その繰り返しだからアスタリスクを使ったんだけど。
[^\n]は、[]の中は先頭が改行じゃ無いって事だとは解るんだけど。
[]で囲むのと、どれかに一致で、先頭が改行の時は除外するって事になるのかな。
最初、ピリオド・アスタリスクとしていたけど、アスタリスクの意味を理解して無かったって事かな?
[]で囲っている文字クラス内の^は先頭じゃなくて否定 .は任意の文字で通常は改行は含まれないがオプションなどで動作が変わる .*は欲張りなマッチとか言われてて、とりあえず取れるとこまで進めてから バックトラックしながらその後の条件があれば取捨選択していく
>>46 あ、スミマセン。
実験したのですが、何もヒットしないでした。
使ってる状況なんですが、TeraPadと言うテキストエディタの外部ツールのTpRegExpなんです。
なんか、正規表現が、こんなに方言化してると思わず、状況後出しに成ってるのが、申し訳ないです。
^が行頭じゃない環境なのか、じゃあこっちで \f[^\n]*\\ 一応リファレンスは調べてみたけど試してはいない。 これでだめだったら、いっそのこと別のエディタにしてしまったほうが楽な気がする こっちの環境(Mery)だと .*\\ でも希望通りの動作になるよ
どうもです。 望んだ動作に成りました。 この外部ツールが曲者なのかな。sakuraエディターだと、.*\\で望みの動作しました。 どうもでした。 毎回呪文を打ち込むのも面倒だなと、VBスクリプトでやろうとしたんだけど、挫折しました。
///
52 :
デフォルトの名無しさん :2011/05/06(金) 19:40:46.16
Linux (CentOS) 上の PHP 5.1.6 だとマッチしました。
memory_limit は php5は 128M に、php4 は 32M にしています。
>>52 の OS は WindowsXP Home SP3 です。
mb入ってんの?
なんだろうねぇ。 対象の文字列を減らすとマッチするのはこちらでも再現した。 なんだろうねぇ。。。。
ありがとうございます。それでした。 pcre.backtrack_limit=200000 で動くようになりました。
勉強になった。 なるべくその設定を変更せずにすむように心がけよう。
よろしくお願いします。 ●正規表現の使用環境 PHP 5.2.9 (XAMPP 1.7.1) ●検索か置換か? 検索 ●説明 入力文字が+、-、数字以外ならエラーを返す ●コード preg_match("/^[+|-]*\d+$/g", $string) (1行ごとに処理するので、/mは不要です) ●希望する結果 +100→○ -488→○ 1024→○ *300→× /200→× Aaaa→× ああ→×
[0-9\+\-] (\+|\-)[0-9]
>>61 > (\+|\-)[0-9]
こちらを使用しました。意図した通りになりました。
正規表現に関係なく、素直に書いてみることが大事なんだと認識しました。
ありがとうございます。
A+10 ○ でもいいの?
突っ込みどころ満載だが とりあえず (\+|\-) なんて書くくらいなら [\+\-] でいいだろ…… * 小数点や指数表記を考えない * 最上位の桁が 0 の場合ははじく * 符号のみの場合もはじく って感じなら ^[\+\-][1-9]\d*$
>>62 >> (\+|\-)[0-9]
>こちらを使用しました。意図した通りになりました。
1024 → × になりませんか?
(\+|\-)?[0-9]+
回答により実装し、問題が分かってきましたので、本来欲しかった結果と合わせて再度質問します。
●正規表現の使用環境
PHP 5.2.9 (XAMPP 1.7.1)
●検索か置換か?
検索
●説明
入力された文字列のエラーチェックで使用します。
入力文字が+、-、数字以外ならエラーを返します。
●正規表現を確認したサイト
HiFi Regex Tester
http://www.gethifi.com/tools/regex ●コード
if( !preg_match("/^(\+|\-)?[0-9]+$/", $string) ) {
エラー文生成
}
(1行ごとに処理するので、/mは不要です)
●希望する結果
○:エラーではない、×:エラーとなる
0→○
+0→○
-0→○
+100→○
-488→○
1024→○
/200→×
Aaaa→×
ああ→×
12+1→×
5-10→×
>67 ^[-+]?\d+$
>>67 希望する結果にならなかった例を挙げない人だよね。
>>69 情報の小出しになっていることは認めます。
1→○ 01→?
72 :
デフォルトの名無しさん :2011/05/22(日) 14:18:14.06
長い文字列から文字列を抽出したいんだけど、どうすれば簡単ですか? 122ch345673ch89 この文字列から2chと3chの間の文字だけを取得したいです
正規表現自体は2ch(.+?)3chとかだけど 実際にどう抜き出すかは使ってる言語やツール次第
75 :
デフォルトの名無しさん :2011/05/22(日) 14:32:52.41
じゃあC#でも大丈夫だよね
正規表現は
>>74 のを使わせてもらった
using System;
using System.Text.RegularExpressions;
...
Match m = Regex.Match("122ch345673ch89", @"(?<=2ch).*?(?=3ch)");
Console.WriteLine(m);
34567
VBじゃないと読めないかもしれない Imports System.Text.RegularExpressions Module Module1 Sub Main() Dim m As Match = Regex.Match("122ch345673ch89", "(?<=2ch).*?(?=3ch)") If m.Success Then '隊長!発見しましたぞ! Console.WriteLine(m.Value) End If End Sub End Module
隊長なごんだ。
79 :
デフォルトの名無しさん :2011/05/23(月) 10:39:22.11
aaa=bbb;ccc=ddd;eee=fff という感じの文字列からcccの値dddを取得したいです。 dddは可変でその部分にはセミコロンとカンマは入ることはありません。 (セミコロンは区切りとしては使いますが値としては使いません。) cccは最後に書かれてる場合もあり、その場合は、 上記のeee=fffのように最後にセミコロンがつきません。 そこで正規表現なんですが、 ccc=(.*?;|[^;\,]+$) という感じにしました。 後方参照で()内の部分を取り出したとき、 ccc=ddd;のときは、「ddd;」といった感じにセミコロンつきで取得され、 ccc=dddのときは、「ddd」といった感じにセミコロンなしで取得されます。 ccc=ddd;のときでもセミコロンなしで取得したいのですが、 正規表現のみで可能でしょうか?
ccc=([^;,]*) だけじゃだめなのかな? 先読み使えばこう書けるけど ccc=(.*?(?=;)|[^;,]+$)
>>80 ありがとうございます!
>ccc=([^;,]*)
これでとることができました。
正規表現難しいです><
82 :
デフォルトの名無しさん :2011/05/23(月) 13:48:15.55
C#で以下のように書いた場合、これってASCIIコードをさすんだよね? 「\x○○」のところ。 str=@"[^\x00-\x22\x27-\x2D\x3A\-\x3B\x3F\x5B\x5D\x5E\x60\x7B-\x7D\x7F]+" ;
asciiなら、"[#$%&./0-9<=>@A-Z\\_a-z~]"と同等だね。
Perl互換表現の\wからアンダースコアをとったものの連続を表現 ようするに[0-9a-zA-Z]+と同等なことをしたいのですが [\w^_]+とかでは動きませんでした どう書くのが正しいのでしょうか? [0-9a-zA-Z]+でもいいのですが後学のために教えてください
[0-9a-zA-Z]+
86 :
84 :2011/05/24(火) 08:17:33.28
すみません自己解決しました [\w][^_]+でたぶんいけました スレ汚しすみません
それ間違ってるよ 場合によっては正しく判定してるように見えることもあるけど 本質的には正しくない
88 :
84 :2011/05/24(火) 08:25:36.61
>>87 そうですね
色々値かえて@とか想定外のもの入れたらマッチしてしまいましたorz
つーかさ、[0-9a-zA-Z]+で完璧に条件満たしてるんだから それ以外の書き方をしようとするのがそもそもの間違いだ 初心者の頃って、短く書くことが良いことで正しいとか勘違いしてる奴も多いけど 短く書くより分かりやすく書いた方が絶対いいから まあ[0-9a-zA-Z]+を[a-zA-Z\d]+とするくらいなら、分かりやすさを損なってないからいいけどね 先読み、後読み使えば、\wから_除外したものの連続って表現も出来るけど この程度のことに先読み、後読み使うなんて余りにも無駄すぎるので、 本当に分かってる奴は[0-9a-zA-Z]+か[a-zA-Z\d]+を使う とりあえず、メタ文字として用意されているもの以外の文字集合はベタ書き、これ基本な 「5以外の数字」とかも\dから5を除外するのではなく[0-46-9]が一番良い
>>84 文字クラスのintersection(&&)が使える処理系なら [\w&&[^_]]+
後学のためっていってるのに説教垂れる奴はなんなんだ
後学のために、短くまとめることにこだわるより 分かりやすく書いた方が良いというアドバイスをしているのでは?
ところでa-zA-Z0-9の順番が一般的だけど、 なんで0-9が先にこないのか不思議。 n進数表記でも0からだし、ASCII char codesは0-9A-Za-zの順番だし、 なんか理由とかあるのかな?
alphanumeric 英数字
[^\W_] \Wがあるならこんなふうに書けるけどちょっと分かりづらいよね
読解性って大事だよね。 読解性犠牲にして短くしてもしょーがない。 誰が見ても、人目で何を意味してるか解る、それが一番大事。
その意見には同意だけど正規表現に限っては難読でもいいわ そういうもんだし そもそも読みやすさを求めるなら規約で正規表現禁止にするわ
> そういうもんだし 君にとってはそうなのかもしれないし、個人的にどう思ってようと勝手だけど 世間的にはそういう認識ばかりじゃないので、主観で断定するのは良くない
世間的にはそういう認識ばかりだと思いますよ 実際コーディング規約で禁止にしてるところは多い 理由は複雑だから
そういう奴等は、コンピュータなんて複雑なものには一切かかわらないようにしたほうがいいね。 やめちまえ。
そうでもないか
(?#comment) とか x オプションで空白無視させたり、 見やすくする方法は色々あると思うけどな
\Wは、半角文字(#$%&など)にしかマッチしないことがある [^a-zA-Z_0-9]だと「いろは」とか「阿伊宇」にもマッチするのに \Wだと「いろは」とか「阿伊宇」にマッチしない ということはと思って試してみたら、 [^\W_]+が、「いろはabc阿伊宇」の全体にマッチした [a-zA-Z0-9]+だと、当然「abc」にしかマッチしないけどね まあ俺が作ったプログラムではなく、他人が作った物での話だけどね
正規表現や三項演算子が業務で禁止されてる表向きの理由は複雑だからだけど、 文字列解析やif-else switch文でダラダラ書いたほうが、 コード量を稼げるからという裏向きの理由もあるんだな。
20年位前ならそうかもね
こんばんは、質問させてもらいます マッチさせたい対象文字列が18xgameとあった場合に、 fps18xgameというのがマッチしてしまいます このfpsという部分だけを除外させてマッチさせるには、どう打ち込めばいいのでしょうか? pc18xgameとか、エロゲ18xgameとかがあった場合は、マッチさせたいので、この「fps」だけを除外したいのです どうかよろしくお願いします
否定後読み
>>109 遅れました。返信ありがとうございます。ルールの名前があると、
探しやすくて助かりました。
否定後読みの説明があるようなところだと他のもいろいろ載ってていろいろ勉強になると思う がんばれ
112 :
uy :2011/05/27(金) 17:00:13.06
本気でがんばれば正規表現だけで言語処理系の字句解析部分を書けそうな気がするんだけど やってる奴いない?
本気も何も、字句解析をtokenizationの意味で言ってるのだとしたら当然できる。 正規表現ってもともとそこに来歴があるし。 flexのinfoは日本語訳もあるから読んでみたら?
複雑さによるんじゃない 正規表現は万能じゃないしな
確かFORTRANがいやらしい。
(COBOL) ///
言語処理系の字句解析って、形態素解析のこと? 特徴抽出やかな漢字変換には使えないよ。 形態素解析も正規表現でしたのは手軽だけど問題だらけ〜
FORTRANやCOBOLにも正規表現あるんか? どっちももう10年以上は見てないなぁ
119 :
uy :2011/05/27(金) 21:14:08.29
>>113 できるんだ、じゃあこれを正規表現で字句解析かくとどうなる?
#include <stdio.h>
struct A {
int x;
}a;
int main(){
return(0);
}
COBOLは今でも銀行系で仕事あるんだよね〜 10年単位で拘束される案件なんだけど、興味ある?
121 :
デフォルトの名無しさん :2011/05/28(土) 00:55:28.05
●正規表現の使用環境 Apache RewriteRule ●検索か置換か? 検索 ●説明 1〜5つのカンマ区切りの単語を一致させたい 連結数は不定 ●対象データ apple apple,orange,pineapple,grape,melon orange,pineapple,melon ●希望する結果 ○apple ○orange,pineapple,melon × ,apple 不定数連結されたパターンに悩んでいます
^(([^,\n]+),?)+$
123 :
121 :2011/05/28(土) 01:12:38.70
>>122 こちらの希望結果が説明不足でした。
せっかくレス下さったのに申し訳ないです。
●希望する結果(追加)
× apple,
△apple,pineapple/peach ・・・ /peachの手前まで一致
五つの単語以外は一致しないようにしたいのです。
お手数おかけします。
>>121 たかだか4個までのカンマを含むアルファベットならびに
一致するという意味かな?
先頭と最後はカンマであってはならないという条件も付くか。
多分カンマが連続してもいけないんだろうな。
^(\w+)(?:,(\w+)){0,4}$
> △apple,pineapple/peach ・・・ /peachの手前まで一致 ^(\w+)(?:,(\w+)){0,4}
>>123 > 五つの単語以外は一致しないようにしたい
apple
orange
pineapple
grape
melon
限定でいいのね?重複は許可するの?
否定先読みとか使えれば何とかなりそうだけどどうなんだろ
5回IF文をかませるとか、 SELECT CASE文で分岐するとか、 そういう実装ではダメなのでしょうか?
^((apple|orange|pineapple|grape|melon),)*(apple|orange|pineapple|grape|melon)(?!,) ながい
エスパー的にこれとみた [a-zA-Z]+(?:,[a-zA-Z]+){0,4}
>>131 せっかく長くしても、apple,melonsoda → apple,melonにマッチ
しちゃうから、\bを入れるか(?![,a-zA-Z])にした方が良いのかも
^((apple|orange|pineapple|grape|melon),)*(apple|orange|pineapple|grape|melon)\b(?!,)
^((apple|orange|pineapple|grape|melon),)*(apple|orange|pineapple|grape|melon)(?![,a-zA-Z])
134 :
131 :2011/05/28(土) 10:29:24.27
なるほど、気付かんかった
エロサイトかアフィサイトのアレか
136 :
121 :2011/05/28(土) 13:34:52.46
137 :
121 :2011/05/28(土) 13:38:50.15
>>128 ,131,132,133
今、手元に環境がないので確認出来ませんが試してみます
ありがとうございます!!
>>133 melonsoda、ワラタ センスありますね
ttp:// が入っていない文章にマッチさせるにはどう書けばいいですか?
POSIX又は拡張POSIXでお願いします
POSIXはよくわからんけど、とりあえず
^((?!
ttp:// ).)*$
>>141 (((((((((([^t]*)*(t+[^t][^t]*)*)*)*(t+[^p][^t]*)*)*)*(t+[^:][^t]*)*)*)*(t+[^/][^t]*)*)*)*(t+[^/][^t]*)*)*
このスレのレス全部あぼーんしたw
144 :
デフォルトの名無しさん :2011/06/05(日) 05:10:16.10
(本文が長すぎるというメッセージが出るので2つに分けています) ●正規表現の使用環境 ActionScript 3.0 ●検索か置換か? 検索 ●説明 文字列の先頭が「プラス符号かマイナス符号か数字か」と 末尾が「数字か」でBoolean判定を行いたい。 ●対象データ 1.2345 +123.45 -3.1245 青3.1245 3.1245赤 ●希望する結果 1.2345→true +123.45→true -3.1245 → true 青3.1245→false 3.1245赤→false
^[-+0-9].*[0-9]$
146 :
144 :2011/06/05(日) 05:15:57.11
続き) 試したコードは下記です。 var patt0 = new RegExp("^(\d|[-]|[+])");//先頭部分の判定 var patt1 = new RegExp("\d$");//末尾 if (patt0.test(str0) == true && patt1.test(str0) == true) { //trueと出力 } else { //falseと出力 } 最初と最後の文字のみに注目しているのでフラグ("g"など)は無しにして いますが、上の記述だと 1.2345 でもfalseが出力されます。 どう変えれば良いでしょうか? 因みに、ActionScriptはJavaScriptと同じECMAスクリプトを起源にしています。 (正規表現も共通点が多いようです)
147 :
144 :2011/06/05(日) 05:28:11.19
>>145 光の速さでレス有難うございます。
動作OKでした。
戻り読み条件が、長さ固定でないとダメなのって なんでなのかな?そんな難しいことなの?
>>148 何でだろうね。
Perlなら\Kでできるけど。
>>148 正規表現を実装することを考えればわかると思うけど試行回数がとんでもない数になる
なんで? ふたつの正規表現が、並んでるか並んでないかだけの話じゃないの?
主旨から外れますが、
>>149 の言うように「perlは正規表現から始まった」という印象がありますが、
実際、perlは正規表現については今でも特異な地位(優位性)を持っているのでしょうか?
Java、PHPを業務で触ってきましたが、perlはまだなので気になっています。
perlに優位性は特にないけど perl風に実装することにはあるんじゃないかな
●正規表現の使用環境 PHP 5.1 ●検索か置換か? 検索 ●説明 角括弧が対応する始点から終点までをすべて抽出したいです。 ●対象データ [[hoge:f1=piyo,f2=fuga]foobar[[hogera:]]baz][[qux:a=xyzzy]] ●希望する結果 ほげ[[hoge:f1=piyo,f2=fuga]ふが[[hogera:]]ぴよ]ほげら[[foo:]ぴよぴよ][[qux:a=xyzzy]] 1^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2^^^^^^^^^^^^^^^3^^^^^^^^^^^^^^ ご教授よろしくお願いします。
対象データが誤ってました。すみません。下記の通りです ●対象データ ほげ[[hoge:f1=piyo,f2=fuga]ふが[[hogera:]]ぴよ]ほげら[[foo:]ぴよぴよ][[qux:a=xyzzy]]
括弧の入れ子はイヤズラ
()
>>156 \[((?>[^[\]]+)|(?R))*\]
>>159 > 括弧の入れ子はイヤズラ
> <hr>
> ()
になってんだけどどうなってんの?
ノtasukeruyoみたいな。
忍法帖関係でその時間帯にbbs.cgiの変更やってたせいじゃないかな
なるほど d
javascriptの正規表現って、改行で終わる文字列の終端に行頭がマッチしちゃうのか 変なの
>>160 報告遅くなりましたがそれでできました!ありがとうございます。
166 :
デフォルトの名無しさん :2011/06/14(火) 19:24:59.26
おしえてください ●正規表現の使用環境 perl ●検索か置換か? 置換 ● これはどういう置換でしょうか $salt =~ s/[^\.-z]/\./go;
166 自己解決しました。 '.'(0x2e)から'z'(0x7a)までの文字以外の文字は'.'(0x2e)にするのですね
168 :
デフォルトの名無しさん :2011/06/15(水) 19:57:29.96
よろしくお願いします ●正規表現の使用環境 PHP ●検索か置換か? 置換 ●説明 いくつか連続した\nを、すべて<br />に置換 ●対象データ \n \n\n\n (連続数は1〜n) ●希望する結果 <br /> <br /><br /><br />
それはもうエディタの検索置換機能でいいのではまいか…
170 :
デフォルトの名無しさん :2011/06/15(水) 20:04:53.35
>>169 DB上に入ってる文字列データをHTMLとして出力するのに使いたいんです・・・
うん、いま気づいた。ごめん str_replace("\n", "<br />", $src);
172 :
168 :2011/06/15(水) 20:19:42.53
提示した条件がちょっと違うようで、 もうちょっと複雑にパターンを考えなきゃいけないようでした。 すぐに説明するのが難しいので一度出直してきます。 お手間取らせて申し訳ないです。
何故わざわざ「連続」というのかサッパリ分からん。
PHPならnl2brで良いと思うのだが・・・
もしかしてこういうことなんかな?w str_replace('\n', "<br />", $s)
言語:JAVA 次の例文で、[ ]の部分にひらがなの「ぺ」が27回続く場合にのみマッチする正規表現 ゆうていみやおうきむこうほりいゆうじとりやまあきら[ ] 処理対象文字 ゆうていみやおうきむこうほりいゆうじとりやまあきらぺぺぺぺぺぺぺぺぺぺぺぺ ゆうていみやおうきむこうほりいゆうじとりやまあきらぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺ ゆうていみやおうきむこうほりいゆうじとりやまあきらぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺ 実行した正規表現 .*ぺ{27} 実行結果 ゆうていみやおうきむこうほりいゆうじとりやまあきらぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺ ゆうていみやおうきむこうほりいゆうじとりやまあきらぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺぺ 何で27回以外の「ぺ」が出力されるのか訳ワカメちゃん
177 :
176 :2011/06/16(木) 22:39:33.33
あああああああああああああああああああ すいません。 そりゃ .*ぺ に「ぺ・・・」が含まれるからだよね。 ほんとすいまぺぺぺぺぺぺぺ
処理対象文字の三番目のが27個だと思ったら違った ひどいいじめだ
ロトの剣で我慢しましょう
180 :
デフォルトの名無しさん :2011/06/17(金) 01:19:28.83
巨大なファイルとか、一度に全部変数に読み込みたくない場合 正規表現に途中までマッチしたとか、もうちょっと食わせれば完全に マッチするとか知ることできれば便利だと思うのですがそのような方法はありますでしょうか?
> もうちょっと食わせれば完全にマッチする エスパーな小人をパソコンにいれるとか。
java.util.regex.MatcherのhitEnd(), requireEnd()とか、PCREのpartial matchingとか?
●正規表現の使用環境 Visual Basic Script ●検索か置換か? 置換 ●説明 タイトルを抜き出して一行目の先頭に書き入れたい ●対象データ 誤爆防止のため、書き込みは移行しました<h1 id="topic_title"><strong><span class="subj">2ちゃんねるたかじんのそこまで言って委員会</span></strong></h1> 1:<strong><span class="name"> </span></strong> : <p class="date">2011/04/16 (Sat) 15:38:46</p> </dt> <dd> 2ちゃんねるマスコミ板スレッド「たかじんのそこまで言って委員会 ●希望する結果 2ちゃんねるたかじんのそこまで言って委員会 1: :2011/04/16 (Sat) 15:38:46 2ちゃんねるマスコミ板スレッド「たかじんのそこまで言って委員会
とりあえずタイトルだけ抜き出し ^.*<.*"topic_title">(<[^>]*>)*([^<]+).*$ \2
検索パターン ^.*<.*"topic_title">(<[^>]*>)*([^<]+).*$ 置換文字列 \2 これでもダメ?
>>186 VBscript内で
repText5 = "\2"
objRep.Pattern = "^.*<.*"topic_title">(<[^>]*>)*([^<]+).*$" ←---★
newText = objRep.replace(newText, repText5)
objFile.Close
' 書き込み
Set objFile = objFSO.CreateTextFile(var1,2,false)
objFile.WriteLine (newText)
って正規表現入れたんですが★の行でステートメントの末尾が不正です。
と、恐らくダブルクォート関連のエラーがでてしまって
実際のプログラム上ではどう動くかまだ実験できてないんです、すみません。
str ="^.*<.*"topic_title">(<[^>]*>)*([^<]+).*$"
objRep.Pattern = str
とかもしてみたんですけど、ちょっと時間掛かりそうです
>>187 objRep.Pattern = "^.*<.*""topic_title"">(<[^>]*>)*([^<]+).*$"
>>188 --------------結果---------------------------
\2
1:<strong><span class="name"> </span></strong>
:
<p class="date">2011/04/16 (Sat) 15:38:46</p> </dt>
<dd>
2ちゃんねるマスコミ板スレッド「たかじんのそこまで言って委員会
--------------ここまで---------------------------
まだよくわかってないんですが
もしかして、\2のところにタイトル文の
2ちゃんねるたかじんのそこまで言って委員会
は代入されないですか?
\2じゃなくて$2じゃね?
>>190 うおおおおおおお
すごいいいいいい
正規表現って変数に入れられるんですね
うまくいきました!
ありがとうございました!
正規表現がいまいち苦手だ。
test
>>192 鬼車の開発がRuby作者との揉め事以降、止まってたから
開発を引き継ぐ人が現れたには大きいね
ところで\Rや\Kってどういうメタ文字なの?
Googleは記号や大文字が検索できないからググってもよくわからないんだ
>>195 Rubyと揉めてたのって2007年頃では?
鬼車の最終更新は2010/01/09
正規表現ってすげぇ難しいよな どっかに例題つきのわかりやすいサイトとかってないのかな 2chのdatファイル整形とか掲示板のhtml整形とかやりたいんだけど 例えば<br>か</br>までとか複数細かくやりたいときとか多くて勉強したいんだよな、興味深いし
サイトは腐るほどあるけど、正規表現の実装も沢山あってどのサイトを見ていいか解らん
正規表現でがんばるよりXMLとしてスクレイピング可能なら、 素直にスクレイピングしたほうがいいように思うけどねぇ。
>>203 すごいです!
ありがとうございます。
今回のでもの凄く正規表現の参考になりました!
>>201 質問内容からして、厳密なマッチは望んでないんでね?
URLだって本来はRFCの定義までさかのぼって考える必要があるものだが
自作ツールなら多少適当でも十分役立つことが多いし
>>197 鬼車の開発は実質2007年に止まったようなものだよ。
>>198 定番だがいろいろなサイト回るよりフクロウ本買って読んだほうが手っ取り早い
それなりの大学図書館なら置いてあるからお金が無いなら借りるって手もある
入れるところの方が多いんじゃね?
ネットの国会図書館で見られるやつにしてよ
学歴とか年齢とか風貌とか関係なく? 入り口の守衛のとこで身分証明証が必要だったり記入したりする事無いの? 一度大学ってものを見学してみたい。
うわ、高卒乙
俺が学生だった頃は、徒歩で入ってくる奴は誰でもわからんかったけど
今は学生証はICカードだし、監視カメラで顔識別・虹彩認証されて
関係のない人間はレーザーで焼き殺されるから、気をつけろよ
>>212
うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙 うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙 うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙 うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙 うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙 うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙 うわ、中卒乙うわ、中卒乙うわ、中卒乙 うわ、中卒乙うわ、中卒乙 うわ、中卒乙 うわ、中卒乙 うわ、中卒乙 うわ、中卒乙 うわ、中卒乙 うわ、中卒乙
国公立はたいてい自由に使える(だいたい入り口で名前と目的を書かされる、ぐらい。 「研究」と書けばおk)。私立だとダメだったり地元民に限ってたりすることも多くて、 自分の所属機関か地元の図書館からの一筆を要求されたりする。 あと図書館とは関係なく大学の出入りは最近チェックがやかましいので、 入構するときに持たされる確認証を図書館でチェックされることがあるので、 無理して潜り込もうとしないほうが無難。
あー、自由と言っても閉架への立ち入りとか計算機の利用とかは制限あるかも。
うちの大学図書館は学生しか立ち入れない部屋とかはあるけど一般にも公開していたかな 今はどうか知らんが通ってた頃は学食とかにリーマンとかも混ざって食事していた
●正規表現の使用環境 grepとかegrepとか ●検索か置換か? 検索 ●説明 a,nの2文字のみが含まれる行を検索したい ●対象データ aaa ann nana anana sin anans ●希望する結果 上4つのみ出力 下二つは引っかからない
^[an]+$
これは正規表現に対する挑戦なのであろうか それはともかく、AAかわいいね
ズバリ、無理でしょう。 多少の誤爆覚悟で、1〜3行のレスを排除する、くらいか。
お題もスレ趣旨も棚上げするけど そのスレの332の本文でレス抽出すれば割りと希望の状態になるはず。
" | " だな
それだけで一つのテーマになりそうなお題 ベイジアンフィルタとか使ってみるか?w
229 :
223 :2011/06/29(水) 00:46:23.81
皆様レスありがとうございます! うーんやっぱり難しいというか、こりゃ無理ですねw(汗 ただ、全角スペース3個並びを抽出したり " | "を抽出する、でかなり理想通りになりました アドバイスありがとうございました!
<(.*)>を取得したいのですが <aiueo> <aiueo<kakikukeko> これはaiueo kakikukekoの2つを取得したいのですが このままだと aiueoとaiueo<kakikukekoが取得されてしまいます どうしたらいいでしょうか?
<([^<]+)> * のほうが都合よければそっちで。
233 :
231 :2011/06/29(水) 17:12:48.09
ありがとうございます! 動きました 意味が分からないので調べタイと思います
----- [[[[[ <(.*)>を取得したいのですが ]]]]](キリッ!キリッッ!!!!キリッッッ!!!! ---- [[[[[[[ <aiueo<kakikukeko> ]]]]]]](キリッッ ---- [[[[[[ これはaiueo kakikukekoの2つを取得したいのですが ]]]]]](キリ!!!!キリッッッッ!!!!キリきリッッ!!!キリッ -- [[[[[[[ aiueoとaiueo<kakikukekoが取得されてしまいます ]]]]]]](キリッッッッ!!キリッッッ!キリキリッ ---- [[[[[[[[ どうしたらいいでしょうか? ]]]]]]]](キリッッッ!キリッッッッ!キリッッッッ!! ---------------(キリ
引用してるつもりなのかな
英数字プラスセミコロンはとれるのですが英数字の桁数が{3}をつけてもうまくいかず悩んでいます。 ●正規表現の使用環境 VBA ●検索か置換か? 検索 ●説明 対象データのフォーマットチェックをしたいです A01;B02;C03;… 英数字3桁がセミコロンで区切られたデータに対して様式通りならtrueを返します 一番最後にはセミコロンはつきません ●対象データと希望する結果 A01;B02;C03 →true A01;B02;C03; →false A01;B092;C03 →false
([A-Z]\d\d;)*[A-Z]\d\d でどうだろう
ええと、セミコロン以外は半角英数字3文字なので、 901;B02;C3J といったものでもtrueにしたいのです。
^([a-zA-Z0-9]{3};)*([a-zA-Z0-9]{3})$ ながい 半角英数で一文字で表現できたっけ?
×半角英数で一文字で表現できたっけ? ○半角英数って一文字で表現できたっけ?
\wは_が入っちゃうからなあ [:alnum]とかないことはないけど使ったことが無い
後半のカッコ削って [0-9] を \d にして別クチで IgnoreCase にするぐらいかな。 \w は指摘出てるし環境的に [:alnum:] も使えないみたい。
243 :
236 :2011/07/06(水) 22:27:43.30
即レス有難うございます。 ([a-z0-9]{3};)*([a-z0-9]{3})と考えていたんですがこれだと 001;002;003;0084でもTrueになってしまって困っていました。 ^$入れると変わるんですね。。。
よろしくお願いします。 ●正規表現の使用環境 JavaScript ●検索か置換か? 検索 ●説明 xという文字から、xという文字までの取得 ただしyxというパターンが含まれている場合は飛ばして、次のxを探す x((?!yx).)*xを試しましたが、途中で検索が打ち切られて思うようになりません ●対象データ "ab\"c",'def' ●希望する結果 "ab\"c"
245 :
244 :2011/07/08(金) 15:09:19.28
すみません追記です 検索表現にgをつけて使用します while(a = /reg/g.exec(str))〜のようにして
C++ boost の正規表現なのですが、質問です。 hoge="3" fuga="5" という文字列があったとき".*"でマッチしたところ、"3","5"という結果でした サルにもわかる正規表現入門では、.*というのは、可能な限り合致するものまで繋がる と書いてあったので、"3"fuga="5"とマッチされる気がするのですが、 なぜこうなるのでしょうか?
ドットは改行にはマッチしないからじゃまいか 外してるなら周辺コードも貼ると答えやすい
>>246 match_not_dot_newline
249 :
246 :2011/07/08(金) 18:24:28.65
なるほど・・・改行か、調べが甘かったです。確かに改行のせいでした。 247-248さん ありがとうございました。
>>244 x.*(?<!y)x
か
x.*?(?<!y)x
javascriptはわからん
>>244 エスケープありのダブルクォート文字列: "(?:\\.|[^\\"])*"
さらに改行のエスケープも認めない: "(?:\\.|[^\\"\n])*"
254 :
244 :2011/07/09(土) 02:56:37.06
>>250-253 回答ありがとうございました
試してみた結果、x.*(?<!y)xはjs非対応っぽいです
"(.*?[^\\])?"だと、"abc" + "def"という表現を全部取得しちゃう(これは
>>244 の例が悪かったです。すみません。"でくくった文字列を取得したいと書けばよかった)
"(?:\\.|[^\\"])*"は望みの動作でした。\\.で、エスケープされた文字を表現するんですね
質問失礼します。
http://stocks.finance.yahoo.co.jp/stocks/history/?code=9984.T .
.
.
<td>2011年6月30日</td>
<td>3,010</td>
<td>3,050</td>
<td>2,986</td>
<td>3,030</td>
<td>8,376,600</td>
<td>3,030</td>
.
.
このページのソースから正規表現で、下記のように日付と株価の部分だけ抜き出すにはどうしたらよいでしょうか?
2011年6月30日
3,010
3,050
2,986
3,030
8,376,600
3,030
.
.
.
.
言語はRubyで、([^<>]+)などで色々やってみましたが、どうにもうまく抜き出せません。
また、webのHTMLから、正規表現である程度特定して文字列を抜き出し、
その特定して抜き出した文字列に再度正規表現で、文字列を特定していくという
方法は可能でしょうか?
よろしくお願いします。
^</tr><tr>\n((^<td>.*</td>\n){7}) \1 で一塊ずつ抜き出して、 ^<td>(.*)</td>$ \1 でさらに中身の抜き出し
258 :
255 :2011/07/10(日) 02:39:16.37
>>257 ありがとうございます。
しかしながら、うまくいきませんでした。自分はwindowsを使っていますが、プログラム初心者なので
うまく理解できていない部分がたくさんある可能性が高いので一つ一つ分解して勉強させてもらいます。
株価が取り出せれば良いなら、Rubyや正規表現に拘らなくて良いじゃん。 どの言語でも良いけどループ使えば簡単だし。
260 :
255 :2011/07/10(日) 03:06:58.57
>>259 ありがとうございます。まだ、Rubyとjava以外ほとんどさわったことがないです。
毎日の株価を自動で取得したり、過去の株価データ10年分、全銘柄をDBにいれて、ストラテジーをバックテストできる環境を作ろうと思いまして
javaなどをやってみたりしたんですが、プログラミングがむずかしくてうまくいかず、一番しっくりきたのがRubyでした。
株価ですが、ある程度期間がたつとwebのHTML形式が細かく変わっていくので正規表現を覚えてwebからスクレイピングしていくのが一番良いと判断しました。
まだ、株価を綺麗に抜き出す段階で苦労しています。
>>260 正規表現じゃなくて、XMLパーサ使ったほうが簡単だよ。Nokogiriをつかえば、
# coding: utf-8
require 'open-uri'
# require 'rubygems' # 1.8系では必要
require 'nokogiri'
Nokogiri(open('
http://stocks.finance.yahoo.co.jp/stocks/history/?code=9984.T ').read)\
.search('table.boardFin tr').map{|e| e.children.map(&:content).reject{|ee| ee == "\n"}}
# => [["日付", "始値", "高値", "安値", "終値", "出来高", "調整後終値*"], ["2011年7月8日", "3,190", "3,190", "3,105", "3,110", "6,151,100", "3,110"], ...
262 :
255 :2011/07/12(火) 22:21:39.52
>>261 ありがとうございます。やりたいことが完璧にできました。
感謝です。
●正規表現の使用環境 Boost.Regex ●検索か置換か? 検索 ●説明 文字列の要素を抜き出したい ●対象データ [push x ='100' y= '200' name = 'aaa'] [ins x = '100' y='200' z='300' name='ppp'] ●希望する結果 push x 100 y 200 name aaa ------------------- ins x 100 y 200 z 300 name ppp \\[(\\w+) +(\\w+) *= *'(.*)' +(\\w+) *= *'(.*)' +(\\w+) *= *'(.*)'\\] で、あらかじめ要素数が決まっていれば可能なのですが、 [A B='C' ...] と要素数が不定な数ある場合どうすればいいでしょうか?
Boost.Regex知らないからNCNRでお願いします 標準的正規表現で [^\[\s='\]]+ これをグローバルマッチさせればいいんでないの ただし、クオーテーション内に[]\s=は使用不可 イテレータとか違うのかな
>>263 例えば、一行目の
name aaa と
二行目の
x
100
の差が何によって起こるのかわからない。
オペレータ '=' と左右の空白は同一の
形式だと思うが。
>>263 while や for で何度もマッチさせるんだよ
>>266 /((?<![\"\'>])(htt〜
>>268 エラーになってしまいます
[^\=\"\'>](https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)
これでできたので、とりあえず書いてみます。
いつもお世話になっております。
>>261 この ('table.boardFin tr')というのは、Xpath、正規表現、またはnokogiri専用の表記のうち
どれにあたるのでしょうか?ぐぐってみても見つからずどうやって、この辺の表記の仕方を勉強すればよいでしょうか?
>>270 rubyは触ったことないけど、そのいずれにも当てはまらなくね?
どう見てもCSSセレクタの表記にしか見えない
>>270 >>271 の言うとおりただのCSSセレクタ
意味は「クラス属性のひとつがboardFinのtable要素 の 子孫要素 の tr要素」
id属性だけで特定できるならxpathが簡単だけど、クラス属性を使わないと特定できないなら
属性を簡潔に書けるCSSセレクタの方が好きかな。
Nokogiriはどっちにも対応してるし、ちゃんぽんにしても書けるみたい。
273 :
270 :2011/07/19(火) 19:57:43.31
274 :
270 :2011/07/20(水) 00:30:34.52
>>272 重ね重ね申し訳ないのですが、
map{|e| e.children.map(&:content).reject{|ee| ee == "\n"}}について
.reject{|ee| ee == "\n"}これは、改行の\nを取り除くということは、わかったのですが
.map{|e| e.children.map(&:content)
はchilderenの中の数字の部分を取り出すという意味だとおもうのですが
&:content ここの部分がどこを指すのか、わかりませんでした。
HTMLソースの<meta http-equiv="Content-Type" content="text/html; charset=utf-8">に
contentという文字を見つけたのでここ由来でテキスト表記を取り出すという意味なのかなと考えて
いますが、あっていますでしょうか?
また&:はどういう意味で下記で言えばどこの部分になるのでしょうか?
[#<Nokogiri::XML::Element:0x1def1d8 name="td" children=[#<Nokogiri::XML::Element:0x1def1d8 name="td" children=[#<
1def156 "2011\345\271\2647\346\234\21019\346\227\245">]>,#<Nkogiri::XML::Text:0x1db3f84 "\n">
よろしくお願いします。
なぜそれを正規表現スレで聞く
276 :
270 :2011/07/20(水) 00:59:54.16
>>275 申し訳ないです。
最初は正規表現で抜き出そうとしていたのですが、XMLパーサーの方がよいというアドバイスをうけ質問を続けてしまいました。
あと、272さんに是非聞いてみたくて、これを最後にここでのXMLパーサーの質問はやめます。
>>274 contentはNokogiri::XML::Nodeクラスのメソッドでノード(要素)の中身(文字列or nil)を取り出す。
enum.map(&:meth)はenum.map{|e| e.meth}の簡略表記。
スクレイピングはライブラハックみたいな事件もあるから注意してやってね。
これ以降はRubyスレで。
278 :
255 :2011/07/20(水) 04:38:35.98
>>277 大変ありがとうございます。勉強になりました。
ライブラハックぐぐってみました、自分が買ったシステムトレードの本にも
アクセスは10秒に一回程度にしてと書いてありましたし、人様に迷惑のかからない範囲で
最新の注意を払ってやります。
●正規表現の使用環境 C# 4.0 ●検索か置換か? 置換です ●説明 HTMLファイルのソースコードの <script type="text/javascript">〜省略〜</script> scriptタグ開始を含めてscriptタグ終了タグまでを消去したいんです ●対象データ <script type="text/javascript"> <!-- // 〜コメント〜 内容 // --> </script> <script type="text/javascript" src="script.js"></script> 上記のどちらも以下のものでやったのですが、どうもヒットしません <script\s[a-zA-Z0-9<>()-\.!_~*,;/:@&=+$,%#'""]+>[a-zA-Z0-9<>()-\.!_~*,;/:@&=+$,%#]+\</script> 解答よろしくお願いします
C#分からんけど、こんなのでどう? <script\s[\s\S]*?<\/script>
>>279 DOMで消したほうが確実ではないか?
属性としてもJavaScriptとかつけれるわけだし
○ds ○nds ○gameds ○gamends ×legends 検索したときに、○だけヒットさせるにはどうすればいいか教えてください
ds|nds|gameds|gamends
(?<!legen)ds
(game)?n?ds
\b(ds|nds|gameds|gamends)\b
○(?=ds|nds|gameds|gamends)
たくさんの回答ありがとうございます うまくできました
どれでうまくできたんだよ 毎度のことだけどヤレヤレだな
●正規表現の使用環境 Emacs Lisp ●検索か置換か? 検索 ●説明 C++などでよく使われる構文にマッチさせたい。 具体的にはクラスインスタンスへのアクセスアローやドットにマッチさせたい。 ●対象データ class A; A a; A* a_ref = &a; a.m_hoge; a->m_hoge; ●希望する結果 これにマッチさせる場合 "\\(?:\\.\\|->\\)\\(\\(?:[a-zA-Z0-9][_a-zA-Z0-9]*\\)?\\)\\=" が正解らしいですが なぜ正解かわからない部分があるので教えてください。 まず"?"演算子の使い方ですが・・・直前の文字列(空文字込み)にマッチさせるために置いてあるとして 直後の ":"が理解不能です。 後半でも、":"が出てきますがこれも不可解。名前空間の"::"などにマッチさせたいのであれば ::や:?:とかならわかるのですが・・
>>290 > 直前の文字列(空文字込み)にマッチさせるために置いてあるとして
?の後ろの文字(列)で意味が変わってくるんですよ
とりあえず、
>>2 のサイトを?:で検索してみて
>>290 (?:pattern) は変数にキャプチャしない
●正規表現の使用環境 LINUX grepコマンド ●検索か置換か? 検索 ●説明 ドットで行に一文字追加されたもののみ検索したい ●対象データ ABC ABCD ABCDE ●希望する結果 ABCD grep ABC. sample.txtとしても 結果 2文字追加されているABCDEまで出てきてしまいます。。。 ドットは一文字と習ったのですが、 なぜなのかわかりません・・。
^ABCD.$
>>291 > > 直前の文字列(空文字込み)にマッチさせるために置いてあるとして
> ?の後ろの文字(列)で意味が変わってくるんですよ
> とりあえず、
>>2 のサイトを?:で検索してみて
>>292 >(?:pattern) は変数にキャプチャしない
>>2 で調べて解決しました。
正規表現はマッチング程度しかつかってなかったので
後方参照とかあまり考えたことなかったですね。
?:をつかっていた解答はパフォーマンス等を気にしていたのかな・・・。
いろいろ勉強になりました。ありがとう。
お願いします ●正規表現の使用環境 Hex Editor Neo ●検索か置換か? 検索 ●説明 1文字目と3文字目が同じで、2文字と目と4文字目が同じの4文字の文字 ●対象データ ABAB PAPA 0101
1文字目≠2文字目 は別に条件に入ってなくね?
んだんだ
301 :
297 :2011/08/12(金) 23:36:38.97
>>298 ありがとうございました。
目的のデータを探す手がかりが出来ました。
ヒットが多いので応用して絞り込みます。
\1を否定しているところがよく解らないので、ここを勉強してみます。
御世話になりました。
>>299 実は入ってる
まあ、説明で「1文字目と2文字目は別文字とする」と明確に書くのが一番だが
その説明が無い場合、というか「1文字目と2文字目が同じ場合を含む」あるいは
「連続する4文字が全て同じ場合を含む」などの条件が明確に書かれている場合を除いて
>>297 の説明だけでも1文字目と2文字目は別文字と解釈するのが正解
そんなバナナ!
以前会社にいた山田君を思い出した
むしろ
>>302 を理解できないような融通の利かない奴とは仕事したくないな。
常識的に解りそうなことでも、事細かに指示や伝達をしないと、
そんなこと言われてないとか屁理屈でゴネるような奴と仕事するとフォローやストレスで大変そうだ。
勝手な思い込みで仕事をしてもらっては困る なぜ一言俺に聞かなかった(ドスンッ まで読んだ
「あ〜、そこは適当にやってもらえばいいから」って言ってた客が、出来上がり
見て「そこは、こう動くのが当たり前だろ」って言う手のひら返しする話をよく聞
くが
>>302 =
>>307 みたいな奴に当たったんだろうな。
まあ、文句言われても「適当にやってもらえばいいから」って言うのを議事録に
書いとくしかないわな。
くが?
1行の文字桁数制限が無いか、あるいは大きなところでまで 固定桁数で改行入れて読みにくい文章書く子って未だに居るよね そういった書き方見ても、書いてる内容見ても、程度が知れるってものだ
?
多くの人に嘲笑されている現実と、自分に反する意見を投げかけているのは皆同一人物という妄想との、区別が付かない人。
どう考えたって一人だろうw
最低でも2人は居る
一人ってのは
>>302 ,307,311,315が同一人物ってことね
それにツッコミや茶々入れてる人は当然含めてないよ
11人いる!
>>309 まさかとは思うが、「適当」≠「適切」だと思っている残念な人?
(指示を出すまでもない当たり前のことだから使用には詳細に書いていないけど)適当にやってくれ。
言わせんなよ、恥ずかしい。
詳細以前にスレタイ読もうよ。
>>297 をを読んで
「指示を出すまでもない当たり前のことだから仕様には詳細に書いていないけど1文字目≠2文字目だから」
と自信満々言い切る人間がこの世に存在するという事実が、なんというか、すごいです。
>言わせんなよ、恥ずかしい。 確かにあんな的外れ恥ずかしくて普通は言えないw そこをあえて言った勇気に敬意を表するw
そうだね、>297には一致とも不一致とも書かれていないのだから、 どちらの場合も考慮するのが正しいエンジニアリングだね。 だからと言って、2chの回答にそれを求めるのは間違いだと思うが。
推して知るべし って言葉を知ってるかい?
それは知ってるが、知ってるからといっていつもそれを適用しちゃだめだろ。
正規表現 Part8 って言葉を知ってるかい?
仕事と2chを一緒にする馬鹿が多いな 仕事なら仕様としての抜けを確認するのが普通だが 2chなら別に通常普通ならこういう動作を求めるであろう答え書いてやれば十分だろ
仕事でなければバグを指摘しなくていい、とは画期的な意見だな
バグであるかどうかは本人以外わからん事だろ
>>321 指示を出すまでもない当たり前のことが標準化されてない事実にいい加減気付け
指示を出すのは仕事の話だろ 2chで指示を出す奴はいない
要するに自分では自明だと思っていたことが 他の人にとっては自明でもなんでもなかったって話だね
ローカルルールさえ守れない間抜けどもがグローバルルールを語るお笑いスレはここですか?
>336 "何が来るかわからない"が'.'を含むなら上と下は同じになる。 たぶん"何が来るかわからない"に含まれない文字はわかっているはずだし、 ホスト名/ドメイン名部分の"何が来るかわからない"と パス部分"何が来るかわからない"の文字種は異なるはず。
>>336 例えばこんな感じかな?
(「何が来るかわからない.」という部分が1〜何個続いてもマッチする)
http:\/\/ ([^.]+\.)+?test\.com\/[^\s]*
URLの検索に使う正規表現は用法によって様々
これで問題あれば
>>4 のテンプレを埋めて詳細に質問すべし
非難する暇があるなら、正解を教えてあげればいいのに。
こんなんではどう?
http:\/\/ (.*\.)*test.com\/.*
>>340 > 正解を教えてあげればいいのに。
と言いながら、正解を教えず、間違いを教えて騙すのは如何なものかと
それは正解じゃないだろw https?:\/\/(?:[^./]+\.)*test.com\/\S* まだやるならこうじゃね? RFC的には何でもOKになったんだっけか・・・・?
「何が来るかわからない」の部分が、ドットは勿論のこと
スラッシュを含まないとは一言も書かれていないな。
これは".test.com/"がパスの構成部分である可能性を排除しない。
オレはまた
>>297 からの流れで、スレ住人が試されてんのかと思っちまった。
345 :
343 :2011/08/16(火) 18:44:45.50
\w は - にマッチしないからまずいね 代わりに [-A-Za-z0-9_:]
コロンいらないな。スレ汚し失礼
URLにID,PASSを記述する時には:だけでなく@も必要になるが
たしかに。ホスト名の前に来るから省いちゃ駄目か
>>344 スラッシュを含まないとは書いてないから、別ドメインでも構わないってどんな思考してるんだよ
そういうのを屁理屈っていうんだよ
まああれが URL であるって定義もないしな。w
.*
これは
>>336 の要求(「上の2つともにマッチさせる正規表現」)を完全に満たす。
>>353 URLであるとは書かれてないから、ドットの連続も認められるとでも言いたいのか?
ほんと馬鹿じゃね?それより夏休みの宿題は終わったか?
>354がRFC的に妥当なURLのみマッチする (=RFC的に無効なURLにはマッチしない) 正規表現を書いてくれるらしいので期待 # まさか「.*」を「ドットの連続」と読んだ # ってオチじゃないよね...?
>>355 ># まさか「.*」を「ドットの連続」と読んだ
># ってオチじゃないよね...?
お前やっぱ馬鹿だったんだな・・・
.* は改行文字を除く1文字の0回以上の繰り返し
したがってRFCの仕様に反してドットの連続も認められるってことになる
まともな正規表現が書けないなら黙ってろよ
それ全部理解してるからこその
>>355 のレスになってると思うんだが・・・
>>353 は小論文で自由に論じなさいと言われて
本当に自由に論じて0点喰らうタイプ
でもAO入試でひとりから絶賛されるタイプ
「やっぱ」って、このスレに書いたの 数ヶ月ぶりなんスけど...(^^; ナニコノヒト > したがってRFCの仕様に反してドットの連続も認められるってことになる o.k. つまり「RFCに沿ってドットの連続を認めない 正規表現を書かなければならない」 という意図の発言だったってことね > ドットの連続云々 # だから>355(の前半部)の発言になってるんだけど... # >357さん、正解です :) ちなみに、RFC的制限のほんの一例ですが、 ドットによって区切られた各ラベルの先頭及び末尾に ハイフンを用いてはならないのは当然ご存知ですよね? (見たところ、この制限を反映させた回答は出ていないようですが...) では引き続き、>354さんがRFC的に妥当なURLのみ マッチする(=RFC的に無効なURLにはマッチしない) 正規表現を書いてくれることに期待
URIのマッチングにRFCに照らして〜とか正気で言ってんのか? ( ゚,_ゝ゚)バカジャネーノ
答えが出なかったら
>>360 が正解を書いてくれるんだろう
それはそれでスレにとって有益なんじゃないか
>361 ぃゃ、ワタシもそこはテキトーに済ましときゃ いい部分じゃないかと思っているんですが (でないと泥沼にはまるのは目に見えてるんで)、 ワタシじゃなくて>356さんにとっては 譲れない部分みたいなんで...(^^A;;
>362 いえ、ワタシは「それは現実的じゃない」派なんで (従って*ワタシは*正解を出せません)、 だからこそ>356さんの回答に期待している というわけなのです :) (相当に自信がおありのようなので)
ま、連続ドット禁止規定のみ反映させて他は反映させない、ってのはネェわな 他にどんな規定があるのかは知らんが 以前どこかで見たRFC的妥当性を考慮したURLの正規表現は もはや「ほとんど何にでもマッチするような表現」だったような記憶がある・・・
メールアドレスをRFC完全準拠で抽出しようとすると 携帯メアドの一部を取りこぼしちゃうのは有名な話
一部のキャリアがRFC非準拠なアドレスを許してるのは有名な話、と、はっきり書こうよw
Not All RFCs are Standards.
だからなんだ。 白いカラスがいたからって「カラスは白い」って主張が正しくなるわけじゃない。
370 :
297 :2011/08/17(水) 20:26:18.19
以前は大変御世話になりました。 で、自分がいい加減な文章を書いたせいで誤解を招く結果になり、申し訳ありません。 自分の意図は、「1文字目と2文字目は異なる」というものでした。 ですから、教えていただいた方法で正しかったですし おかげで目的のデータを見つける事ができました。 皆さんを試すとかそんな気は一切ありません。 ただ自分の説明がいたらなかっただけです。申し訳ありません。 そして、どうも有り難う御座いました。
正規表現だけが唯一習得出来ないスキルだ。 難しい。
「まともな正規表現が書けないなら黙ってろよ」とか豪語してた
>>356 の自信作はまだですか?
書けないから黙ってるんじゃね?
374 :
344 :2011/08/17(水) 21:06:37.05
>>370 ああいう流れの中で
>>336 が投下されたもんだから、もしかして
「この質問でも先と同じ屁理屈をこねてみせるのか?」と誰か(=336)が
スレ住人を試しているのかと思っちゃった、って話だから気にしなくていいよ。
君のことを言ったわけじゃない。紛らわしくてすまん。
think49こんな所にも出没してたのかw
煽りが多いな
a://hoge/ も有りなのか…
あほ毛w
test
●正規表現の使用環境 C# 4.0 ●検索か置換か? 置き換え ●説明 html内の<dd></dd>タグを検索して<dd>と</dd>のみ置き換えたい ためしに<dd>とだけやってみましたが、<dd>タグは置き換えされませんでした ●対象データ <dd>文章1</dd> <dd>文章2</dd> ●希望する結果 文章1 文章2
すいません、自己解決しました
よろしくお願いします ●正規表現の使用環境 Perl ●検索か置換か? 置換 ●説明 数が一桁の場合、0を加えて二桁に整形したい ●対象データ 2010年5月9日 2011年11月12日 2011年4月30日 2011年6月1日 2011年8月20日 ●希望する結果 2010-05-09 2011-11-12 2011-04-30 2011-06-01 2011-08-20
^(\d{4})年(\d\d?)月(\d\d?)日 \1-\2-\3 -(\d)(?=[^\d]|\n) -0\1
386 :
デフォルトの名無しさん :2011/08/28(日) 16:51:25.87
urlは面倒なので手抜き /[^/]+\.jpg /o.jpg /([^/]+)\.jpg /digset_\1.gif
>>389 >$1/o.jpg
>$1/digset_\1.gif
なんでわざわざ改悪するんだよ?馬鹿なの?死ぬの?
[^./]の.ってエスケープしなくてもいいの?
>>387 と
>>388 は別人だから組み合わせてもうまくいかないよ
あと言語が何なのか言っといたほうがいい
394 :
デフォルトの名無しさん :2011/08/28(日) 21:01:52.17
>>393 すいません 言語は分かりませんが
普通のユーザースクリプトに使用します。
分かる人は正解を教えてください
おねがいします
>>394 言語もソフト・アプリ名も言わないの?
それじゃ不明瞭極まりない
何の「普通のユーザースクリプト」か、くらいは説明できるでしょ
最初からテンプレに沿って質問を書いたほうが早道なのになー
なかなか気が狂ってて笑える
398 :
デフォルトの名無しさん :2011/08/29(月) 02:16:27.36
>>396 ウインドウズのブラウザ(chrome)のユーザースクリプト(拡張)に使うんですけど
script.jsです
399 :
デフォルトの名無しさん :2011/08/29(月) 02:39:44.50
400 :
デフォルトの名無しさん :2011/08/29(月) 02:45:32.26
↑
のような形式で
>>386 の置換がが動作する記述を教えて欲しいのです。
エロサイトの画像を一括DLでもしたいんかね
403 :
デフォルトの名無しさん :2011/08/29(月) 10:03:56.24
●正規表現の使用環境 Excel VBA ●検索か置換か? 置換 ●説明 <>で囲まれた文字列を空白に置換したい。 ●対象データ あいうえお<ほげほげ>かきくけこ みかん<りんご<すいか>ぶどう>メロン ●希望する結果 あいうえおかきくけこ みかんメロン --- 検索:<*> 置換: --- というふうにすると、 一番目の例に対してはうまくいくのですが、入れ子になっている場合にうまくいきません。 ↓のような結果になってしまいます。 みかんぶどう>メロン お願いします。
<[^<>]+> で何度か置換
>>403 <(?:[^<>]*<[^<>]*>)*[^<>]*>
>>405 いちご<みかん<りんご<ぶどう>パイナップル>マンゴー>レモン
正規表現だと基本的に有限のネストへの対応しかできないんじゃなかったっけ。
>>403 <(?:[^<>]*<)*(?:[^<>]*>)*[^<>]*>
括弧の対応関係を保証するなら複数回マッチさせる必要がある
409 :
デフォルトの名無しさん :2011/08/29(月) 18:42:33.91
410 :
403 :2011/08/29(月) 21:09:00.42
>>404 ,405,408さん
ありがとうございました。
413 :
デフォルトの名無しさん :2011/08/30(火) 23:14:48.30
>>411 @includeを登録するのを忘れていました
>>412 動作しました
ありがとうございましたm(__)m
414 :
デフォルトの名無しさん :2011/08/31(水) 23:22:12.28
ttp://msdn.microsoft.com/ja-jp/library/ff650303.aspxから拝借した ^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$
を使ってメールアドレスの書式チェックを行っているんですが、
40文字とか多めの文字数で不一致の文字列を試すと、
フリーズしてしまいます。
一致するケースは問題ないんですが。。。
一致しない時はバックトラッキング?が発生している?
実装言語はaspです。
対象文字列が長くて不一致のケースでも、
動作に問題のない一般的なメールアドレスを許容する表現があれば教えて下さい
組み合わせ爆発が起きてるかな?
前半の ([-.\w]*[0-9a-zA-Z])* が原因だと思う なにがやりたかったんだこれ
あやしげな奴でもパスさせてしまって、あとでエラーになったらそこでどうにか リカバリーする、という方針なら適当なパターンでやればいい。 実際に使われているアドレスでもエラーになるかもしれないが、厳密にマッチ する奴が欲しいなら、RFC 5322 正規表現、とでも検索すればむたくた長い奴が 出てくるからそこらへんを参考に。
テキスト中の行頭 ; という記号を置き換えようしています '^\;'とかいたらマッチしません 次に ^\;.* と書いたらマッチするものの 行頭に;がある行の一列すべてがマッチしてしまいます 一体どう書けばよいのでしょうか?
環境は何よ? とりあえずセミコロンに \ はいらない
420 :
418 :2011/09/01(木) 14:10:27.15
それなら普通にこれでできるんじゃないの? ^;
>>421 できました。どうもありがとうございます
(;^ω^)
おつかれさまです。 現在、ニコ生用にゆっくりがコメントを読み上げるソフトウェアを開発しております。 環境は Mac Objective-C でライブラリに RegexKit を利用しております。 質問は正規表現自体に関するものです。 「ww」などを「わらわら」と読ませるために [WwWw][WwWw]+ とやっているのですが、 「ないすw」など、一文字の「w」記号を「わら」と読ませるのに苦労しております。 「w」全てで引っ掛けるのではなく、 英単語ではないもののみにしようとしております。 なので、 what -> x いいw -> ok w -> ok how -> x などというような判定を行いたいです。 対象は「大文字小文字、全角半角」のwです。 もしよろしければ、アドバイスいただけないでしょうか。 よろしくお願いします。
書き忘れましたが、 判定は [^a-zA-Z]*[WwWw][^a-zA-Z]* としてできているのですが、 「わら」とおきかえる場所は真ん中のみにしたいです。 上記の判定式のまま書くと、 「いいw」 -> 「わら」 となります。 これを 「いいワラ」 としてやりたいです。
すいません。上記のもやはり挙動がおかしいです。 何度も申し訳ありません。
s/^([wWwW]+)$/わら/g; s/([ぁ-んァ-ン亜-Kー])([wWwW]+)$/$1わら/g;
コードは UTF-8 として、 (?<![a-vx-zA-VX-Z])([Ww]+)(?![a-vx-zA-VX-Z]) 前後に wW 以外のアルファベットが含まれていない [wW]+ にヒット。
>>427 すいません。文字化けで読めないです。
>>428 かなりおしいですw
少し試しましたが、文頭と文末以外だとOKっぽいです。
(^|[^A-VXYZa-vxyz])([WwWw])\2*\b ↓ $1わら
みなさま、ありがとうございました。 以下のような順番に置き換えていく実装で期待通りの動作をしました。 集約できておりませんが、 計算量的に問題になっていないので、特にバグがなければこれでいきます。 NSMutableString *subjectString = [NSMutableString stringWithString:kanjiString]; NSString *regexString = @"[WwWw][WwWw]+"; NSString *replacementString = @" ワラワラ "; [subjectString match:regexString replace:RKReplaceAll withFormat:replacementString]; regexString = @"(?<![a-vx-zA-VX-Z])([WwWw]+)(?![a-vx-zA-VX-Z]) "; replacementString = @" ワラ "; [subjectString match:regexString replace:RKReplaceAll withFormat:replacementString]; regexString = @"^([WwWw]+)(?![a-vx-zA-VX-Z])"; replacementString = @" ワラ "; [subjectString match:regexString replace:RKReplaceAll withFormat:replacementString]; regexString = @"(?<![a-vx-zA-VX-Z])([Ww]+)$"; replacementString = @" ワラ "; [subjectString match:regexString replace:RKReplaceAll withFormat:replacementString];
適切に場合分けしてやると、より精度が上がって面白いかもね しかし、これが分からん [WwWw][WwWw]+ こうじゃないの? [WwWw]+ 全角半角も変わってるから注意
>>432 wwwwwwwww → ワラワラ
w → ワラ
と書いてあるだろ
>>433 [WwWw][WwWw]+ = [WwWw]{2,}
[WwWw]+ = [WwWw]{1,}
つまり
[WwWw]{1,} ⊃ [WwWw]{2,}
それなのに [WwWw]+ も ワラ に置換するのはおかしいだろ
>>434 ヒットしないから無問題。つまり無駄な箇所。
>>433 ああすまん、2文字以上の場合と理解してたのに勘違いしちまった
>「ww」などを「わらわら」と読ませるために
2文字以上でワラワラね
むしろ他の場所の[WwWw]+が微妙におかしいのか
でも全半角もおかしいぞーWWWWWwwwwwWWWWWwwwww
やだなにこのスレ 草伸びまくってる
W杯とかどうなるの?
わらはい
(?<![A-VXYZa-vxyz])([WwWw])\1*\b(?![.]) ワロタwwwwww ○ w ○ W杯 × how big is ur penis? × www.example.com ×
戻り読みが可能なら
>>428 に手を加えるだけでいけそうだな
(?<![a-vx-zA-VX-Z])([Ww]+)(?![a-vx-zA-VX-Z])|^([Ww]+)(?![a-vx-zA-VX-Z])
>>441 お前さ否定戻り読み全然分かってねーだろ
^([Ww]+)(?![a-vx-zA-VX-Z]) の存在意義が皆無
戻り読みって言いたいだけちゃうかと
ここは草いきれのするスレですね
よろしくお願いします ●正規表現の使用環境 秀丸 ●検索か置換か? 置換 ●説明 ダブルクォーテーションの中の文字を空白扱いにしたい ●対象データ test="daikon" test="daikon ninjin" test="daikon ninjin tamanegi" ●希望する結果 test="" test="" test=""
".*" ""
".+?" ""
"[^"]+" ""
皆さん返答ありがとうございました。
>>447 さんの正規表現で正常動作しました。
vbscriptでバックトラッキングを制御する?>のような表現はないのでしょうか? 調べてみたのですが他言語用ばかりで試しに実装して動かしてみましたがエラーになってしまいました
よく聞くバックトラッキングってMSDNとか見てもいまいちピンと来ないんですが、 わかり易く解説されてるとことかないでしょうか?
452 :
449 :2011/09/07(水) 23:28:26.52
●正規表現の使用環境 C# ●検索か置換か? 置換 ●説明 <b></b>で挟まれた文章を抜き出す ●対象データ <table width="100%" border="1" cellspacing="0" cellpadding="10"> <tr><td><b>ERROR!!<br><br>多重書き込みです。 あと 17秒お待ちください。</b></td></tr> </table> ●希望する結果 ERROR!!<br><br>多重書き込みです。 あと 17秒お待ちください。 ==== これを実行するのに、 responseStr = System.Text.RegularExpressions.Regex.Replace( responseStr, @"(.|\n)*<b>(?<sentence>.*?)</b>(.|\n)*", "${sentence}"); とやっているのですが、 「任意の一文字(改行文字も含む)」 という表現は(.|\n)が最適なのでしょうか。 もっとベターなやりかたがあったら教えて下さい。
>>455 RegexOptions.Singleline
タグの中身を操作するってのは定期的に上がる質問だね まぁフクロウ本でも細かく説明されているほど定番なんだろうけど
>>457 そのサイト、素敵やん?w
あんまスレと関係ない質問だけどトップのバナーって、
なぜ画像分割してるの?結構こういう画像分割してるサイトあるけど、ひとつにまとめたら
ダメなのかなっていつも思ってしまう。
線が細い環境で、画像のロード中何も表示されないよりも少しずつでも表示された方がいいからだろ。
インターレースGIFとかあったな…
インターレースPNGとかプログレッシブJPEGとかあったな…
モーションJPEGがどうかしたの?
468 :
デフォルトの名無しさん :2011/09/10(土) 13:10:40.29
「ecv 0000 ef773s 1111 87ed93」と言った数字、文字、スペースが混ざった文字列から 数字だけのブロック("0000"と"1111")を取り出したい場合のパターンを教えてください。 自分で思いつくのは下記。もっとスマートなやりかたないでしょうか 1.\s→\r\nに置換 2.^(\d+)$→●$1に置換 3.^[^●].*$→空白に置換 4.●→空白に置換 ちなみにサクラエディタです。 よろしくお願いいたします。
\b\d+\b
470 :
デフォルトの名無しさん :2011/09/10(土) 13:48:11.76
男性器で女性器を表現するのが趣味です
>>468 テンプレに沿って処理前・処理後を示してくれてないからよく分からんけど
\s*\w*[a-z]+\w*\s*|\b\s+\b
\n
改行も揃えたければ
^\n|\n$
空文字
サクラエディタでは試してない、悪しからず
※空白と書くと、通常は空白文字=スペース類のことを指すぞ
>>468 (?:^|\s)\d*\D\S*(?=\s|$)
473 :
472 :2011/09/10(土) 14:57:02.29
数字のみ以外の文字列を削除すると想定 数字のみなら (?:^|\s)\d+(?=\s|$)
(?<=\b)(\d+)(?=\b)
475 :
471 :2011/09/10(土) 16:33:45.00
>>468 一発で済むように改良
(?:\s*\w*[a-z]+\w*)*\s*(\d+)\s*(?:\w*[a-z]+\w*\s*)*\n*
$1\n
476 :
468 :2011/09/10(土) 21:56:12.95
どなたかご教授ください・・・ ●正規表現の使用環境 EmEditor ●検索か置換か? 検索 ●検索対照データ (abcdefg:;[]あいうえお)) ●希望する結果 (で始まり、途中にいろいろあっても、))で終わる対象データを検索したいです。 すみませんが、よろしくお願いします。
\(.*\)\) エスケープの仕方がわからんだけかな それともホントは対象データがもっと込み入ってんの?
\(.*?\)\)
かぶったな \(.*\)\)と\(.*?\)\)の違いは、以下で試せばわかる (abcdefg:;[]あいうえお))かきくけこ))
481 :
477 :2011/09/11(日) 02:09:01.68
>>478 >>479 おおお、ありがとうございます、すごいです。
あ、はい、エスケープの仕方がわからんだけかと思います;;
\(.*\)\)と\(.*?\)\)の両方を試してみました。
2つの違いがわかりました。2つ教えてもらってありがとうございました。
どなたかご教授ください・・・ ●正規表現の使用環境 EmEditor ●検索か置換か? 置換 ●対照データ ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[aa][zy]AC[ab] ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[df]AC[aa][fb] ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[bc][fh]AC[ge][eg] ●希望する結果 ;AA[ac][ad]・・・・・[zw][zx][zz];AB[aa][zy]AC[ab] ←;AAの後ろから[aa][zy][ab]を削除 ;AA[ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[df]AC[aa][fb] ←;AAの後ろから[df][aa][fb]を削除 ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[bc][fh]AC[ge][eg] ←;AAの後ろから、[bc][fh][ge][eg]を削除 すみませんが、よろしくお願いします。
●希望する結果 ;AA [ac][ad]・・・・・[zw][zx] [zz];AB[aa][zy]AC[ab] ←;AAから;ABまでの[aa][zy][ab]を削除 ;AA [ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[df]AC[aa][fb] ←;AAから;ABまでの[df][aa][fb]を削除 ;AA[aa][ab][ac][ad]・・・・・[zw][zx][zy][zz];AB[bc][fh]AC[ge][eg] ←;AAから;ABまでの[bc][fh][ge][eg]を削除 この結果。。。ムリだ
>>482 正規表現だけじゃ無理
マクロでこんな感じにすればいけるんじゃね?試してないけど
document.selection.SelectAll();
document.selection.Text = document.selection.Text.replace(/^;AA((?:\[[a-z]{2}\])*);AB((?:\[[a-z]{2}\])*)AC((?:\[[a-z]{2}\])*)$/gm, function(a, b, c, d) {
var e = (c + d).replace(/^\[|\]$/g, '').split(']['),
f = b.replace(/^\[|\]$/g, '').split('][').filter(function(g) {
for (var i = 0, l = e.length; i < l; i++) if (e[i] != g) return g;
}).join('][');
return ';AA['+ f + '];AB' + c + 'AC' + d;
});
485 :
482 :2011/09/14(水) 01:36:56.36
>>483 可能かどうかも全然わかってないので、ご意見ありがとうございました。
>>484 正規表現だけでは無理だけど、マクロでなんとかなりますか、ありがとうございます。
・・・ただ僕はマクロっていうと、マウスのクリックを連打させるツールを使うくらいしかわかってないもので、
>>484 さんの書かれてるすごい内容をどうやって、どうすれば、どのように使えるのか、ほとんど理解できませんorz
何ヶ月、またはそれ以上たって、もっとマクロに詳しくなって理解できるようになったら、この方法を試させてもらいたいと思いますorz
EmEditorにマクロ機能有るだろ 無料版はマクロ機能ないんだっけか?
EmEditorのマクロってこんなECMAScript的な実装なの?
ECMSScript的というかそのものを拡張してあるだけだったはず
ECMSScriptじゃなくてECMAな(´・ω・`)
さくらエディタでも使える
拡張というか、WSHのエンジンをそのまま利用している形だね だからJScriptとVBScript、どちらでもOk
●正規表現の使用環境 vxeditor ●検索か置換か? 置換 ●説明 「a」という文字を正規表現で検索し、「C:\test\test2」に置換するために、 検索語:[a-z] もしくは \w 置換語:C:\test\test2 と置換したのですが結果は「C: est est2」となってしまいます。 置換語を「C:\\test\\test2」としてみたら今度は「\test2」となりました。 ●対象データ a ●希望する結果 C:\test\test2 お願いします
またエスケープか C:\\test\\test2 \tはタブ
>>492 アルファベットのうちの a だけが対象なら [a-z] や \w にする理由が分からん
a
↓
C:\\test\\test2
で十分だろ
よく見たら C:\\test\\test2 でもうまくいってないのか。 Perl互換の正規表現にしてもうまくいかない?
vxeditor 落として試してみたんだが 置換語 C:\\test\\test2 で普通にいけるじゃねーか 正規表現1、正規表現2どっちも問題なかったぞ
秀丸でHTMLソース内のSmartyタグを強調表示させたいのですが上手くいきません。。 Smartyの開始は {{ で修了は }} としています。 現在は正規表現で {{.+}} を指定しているのですが <option value="{{$w.cd}}"{{$w.selected}}>ABCDE{{$w.name}}</option> の場合、Smarty外の 「"」 「>ABCDE 」 も強調表示されています。。 これを何とか強調表示されない指定を教えて下さい神様
>>497 秀丸は知らんけど、最短一致を使う。
{{.+?}}
または
{{[^}]+}}
かな
500 :
492 :2011/09/16(金) 20:11:17.76
みなさんご回答ありがとうございます。
>>498 氏のおっしゃるように、使用しているverが古かったのが原因でした。申し訳ございません
501 :
497 :2011/09/16(金) 23:33:54.30
>>499 うおおおおおおおっ!
上はNGでしたが下はバーーーーーーーーーッチリでしたあああ!
あざーすあざーす
「最短一致」勉強します!
教えていた表記も勉強します!
師匠!ありがががとうございましたあ!
アリガがガトー
●正規表現の使用環境 oracle(regexp_replace) ●検索か置換か? 置換 ●説明 ::でタグ名が記載されたデータを<>タグに変換したい ●対象データ :dog:I like dog :cat:I like cat ●希望する結果 <dog>I like dog</dog> <cat>I like cat</cat>
●試したこと regexp_replace(data,'^:([^:]*):(.*)$','<\1></\1>\2',1,0,'m'); <dog></dog>I like dog <cat></cat>I like cat はできるんですが regexp_replace(data,'^:([^:]*):(.*)$','<\1>\2</\1>',1,0,'m'); としたら </dog> like dog </cat> like cat となってしまいます。。。。
505 :
503 :2011/09/17(土) 12:53:20.88
事故解決しました。 CRLF→LFに変換してから処理すれば問題ありませんでした。
●正規表現の使用環境 Microsoft .NET Framework (使用ソフトウェアは、Repl-Ace on .NETです。) ●検索か置換か? 置換 ●説明 対象データを希望する結果に置換したいです。 対象データ(置換の前後)のフォーマットは、●詳細に書きます。 ●対象データ ABCD 12:34:56 阿あアアAaAa1+-○× : 阿あアアAaAa1+-○× EFGH 00:59:59 阿あアアAaAa1+-○× : 阿あアアAaAa1+-○× ●希望する結果 ABCD\t12:34:56\t阿あアアAaAa1+-○×\t:\t阿あアアAaAa1+-○× EFGH\t00:59:59\t阿あアアAaAa1+-○×\t:\t阿あアアAaAa1+-○× ※\tはタブという意味で書いてあります。 長いので続きます。
●詳細 ■置換前のフォーマット 01.半角 英字 4文字(固定長) 02.半角 スペース(固定長) 03.半角 数字 24時間表示の時刻(固定長) 04.半角 スペース(固定長) 05.全角/半角 漢字/ひらがな/カタカナ/空白/記号等(可変長)★ 06.半角 空白(固定長) 07.半角 :(固定長) 08.半角 空白(固定長) 09.全角/半角 漢字/ひらがな/カタカナ/空白/記号等(可変長)★ 10.CR+LF □置換後のフォーマット 01.半角 英字 4文字(固定長) 02.タブ(固定長) 03.半角 数字 24時間表示の時刻(固定長) 04.タブ(固定長) 05.全角/半角 漢字/ひらがな/カタカナ/空白/記号等(可変長) 06.タブ(固定長) 07.半角 :(固定長) 08.タブ(固定長) 09.全角/半角 漢字/ひらがな/カタカナ/空白/記号等(可変長) 10.CR+LF 長いので続きます。
※★マークの所には、03/06-08と同じ文字列が同じ形式で入る可能性がありますが、 05と09の部分にそれらの文字列があった場合でもそれは残しておきたいです。 例: ・対象データ(1と+の間に07の:、aとAの間に03の日付) ABCD 12:34:56 阿あアアAaAa1:+-○× : 阿あアアAa12:34:56Aa1+-○× ・希望する結果 ABCD\t12:34:56\t阿あアアAaAa1:+-○×\t:\t阿あアアAa12:34:56Aa1+-○× 以上、どうかよろしくお願いします。
度々すみません。 05と09の位置には、06-08の「 : 」が入る可能性はあるのですが、 実際には入る可能性は低いので、もし無理でしたらこの部分は、 入らない事が前提で構いません。 よろしくお願いします。
ながい。 プログラムで実現しろよ。 正規表現に拘ることはない。
^([a-zA-Z]{4}) (\d\d:\d\d:\d\d) ([^ ]+) (:) ([^ ]+\r\n)$ \1\t\2\t\3\t\4\t\5 たしかに長い
フィールド05と09に空白が入ってるのでやる気を削がれた そういうとんでもないフォーマットをTSVに直すってことなんだろうけど…
あー空白もまじってんのか
^([a-zA-Z]{4}) (\d\d:\d\d:\d\d) (.+) (:) (.+\r\n) \1\t\2\t\3\t\4\t\5 こうか
>>514 それだと
" : "
こういった文字列が05に含まれていた場合変になるな
05、09は色々条件書いてるけど等ってなってるから
曖昧なんだよなー・・・
>>515 5に" :"が入った場合は結果が一意に決められなくなるので無視するしかないかと
>>509 06と08が全く同じだけれど、間違いではないのかな?
>>509 それから(固定長)の意味を教えてください。
いくら考えても分からないので、教えてください。 Flexible Renamer8.4というファイル名変更ソフトに「条件付正規表現」というのがあるのですが、どう使うのか分かりません。 ネットで調べるとPearl、PHPなんかで、同じような書式があるようなんですが、挙動がまったく理解できません。 ネット上には (?(?=[^A-Z]*[A-Z])\d{2}-[A-Z]{3}-\d{2}|\d{2}-\d{2}-\d{2}) という式があり、aをアルファベット、dをアルファベットとして上式で検索すると dd-dd-ddとdd-aaa-ddがヒットする、と書いてありますが、dd-aaa-ddはヒットするものの、 dd-dd-ddがヒットしません。 それからよくわかりませんが、 (?(1以上の数字)\d{2}-[A-Z]{3}-\d{2}|\d{2}-\d{2}-\d{2}) とするとdd-dd-ddがヒットします。 自分の理解では条件式にある正規表現があれば真の場合の正規表現をマッチさせ、 条件式にある正規表現がなければ偽の場合の正規表現をまっちさせるのだと理解するのですが、 どうも条件式の書き方と制約、そしてその結果と条件式が真、偽のときにどういう挙動をとるのかがよくわかりません。 誰か分かる人教えてください。すみません教えて君でorz もうアタマが痛くなるくらい調べましたが 私には無理でした。
> (?(?=[^A-Z]*[A-Z])\d{2}-[A-Z]{3}-\d{2}|\d{2}-\d{2}-\d{2}) (?=なんとか)あれ|それ ← なんとかあれ または なんとかそれ にマッチしてあれ・それを取り出す「先読み」。 1111A11-DEC-12 1112A11-12-12 1234B12-JUN-01 C31-MAR-12 D12-03-11 外側の(?....)の方は、わたしじゃわからないわ
>>519 if 〜 then 〜 else 〜 と同じ
> (?(?=[^a-z]+[a-z])\d{2}-[a-z]{3}-\d{2}|\d{2}-\d{2}-\d{2})
「(?=[^a-z]*[a-z])」という条件(英字が0文字以上の繰り返しの後に、英字1文字が
出現する)にマッチしたら、真パターンである「\d{2}-[a-z]{3}-\d{2}」でマッチングが行われる。
そうではないなら、偽パターンである「\d{2}-\d{2}-\d{2}」でマッチングが行われる。
従って「dd-aaa-dd」または「dd-dd-dd」のどちらかの文字列にマッチする。
>(?(1以上の数字)\d{2}-[A-Z]{3}-\d{2}|\d{2}-\d{2}-\d{2})
これはちょっと違う
([a-z]{3}-)?(?(1)\d{2}-[a-z]{3}-\d{2}|\d{2}-\d{2}-\d{2})
例えばこれだと、「[a-z]{3}-」で始まる場合は、「キャプチャグループ1」に記憶される
そして「キャプチャグループ1」が存在するなら、真パターンである「\d{2}-[a-z]{3}-\d{2}」で
マッチングが行われる。
そうではないなら、偽パターンである「\d{2}-\d{2}-\d{2}」でマッチングが行われる。
従って「aaa-dd-aaa-dd」または「dd-dd-dd」のどちらかの文字列にマッチする。
522 :
521 :2011/09/18(日) 14:51:24.41
英字が0文字以上の繰り返しの後に、英字1文字が ↓ 英字以外の文字が0文字以上の繰り返しの後に、英字1文字が
523 :
520 :2011/09/18(日) 15:03:48.05
(?(condition)yes-pattern|no-pattern) だそうなので、これやってみて。 > (?(?=[^A-Z]*[A-Z])\d{2}-[A-Z]{3}-\d{2}|\d{2}-\d{2}-\d{2}) ↓ (?([^A-Z]*[A-Z])\d{2}-[A-Z]{3}-\d{2}|\d{2}-\d{2}-\d{2})
524 :
521 :2011/09/18(日) 15:10:13.77
>>523 それじゃエラーになる
条件に使えるのは先読みか戻り読みか1以上の数字だけだよ
>>521 ありがとうございます。
>if 〜 then 〜 else 〜 と同じ
そうですよね。そう考えているのですが、条件式の書き方が分からないのと、
結果が分からないのです。さきほどから取り上げている
(?(?=[^A-Z]*[A-Z])\d{2}-[A-Z]{3}-\d{2}|\d{2}-\d{2}-\d{2})
だと、おっしゃられるようにたとえば条件式が真の場合の12-abc-34とか、
偽の場合の12-34-56がヒットするはずですが、実際には偽の場合がヒットしません。
FlexRenamer8.4のバグなんでしょうか?
それから、やはり条件式の書き方がわかりません。上式で条件式を.*とした
(?(.*)\d{2}-[a-z]{3}-\d{2}|\d{2}-\d{2}-\d{2})
としたら、とうぜんすべてが真になるはずなので、dd-aaa-ddがヒットするはずですが、ヒットしません。
同様に条件式を
\d*
\d\d
実際の文字列そのものとしてdd-aaa-dd(12-abc-34など)
としてもうんともすんとも言いませんorz なんでなんですかね???
528 :
520 :2011/09/18(日) 16:09:24.11
(?=^[^A-Z]+) なら先頭がA-Zの場合、偽になるはず。ソフト入れてないので中途半端ですみません。 (?(?=^[^A-Z])\d{2}-[A-Z]{3}-\d{2}|\d{2}-\d{2}-\d{2}) 1234B12-JUN-01 C31-31-12
>>524 おお、そうなんですね。条件式の件はちょっと進歩。しかし偽の場合がマッチしないのは謎。
>>527 たぶんバグなんじゃないかと思う
>やはり条件式の書き方がわかりません。
条件に使えるのは
>>524 で書いたように(肯定or否定)先読み、(肯定or否定)戻り読み、1以上の数値のいずれか
>(?(.*)\d{2}-[a-z]{3}-\d{2}|\d{2}-\d{2}-\d{2})
「dd-dd-dd」または、直前に「.*」のある「dd-aaa-dd」にマッチさせたいってこと?
それとも「(?=.*)dd-aaa-dd」または「dd-dd-dd」にマッチさせたいってこと?
前者だと (?<=.*) ということになるが、戻り読みは固有長じゃないといけないのでエラーになる
後者だと「.*」は改行以外の0文字以上の繰り返しなので、これでは真パターンのみしか
使われないから、エラーにはならないけど、表現としておかしい
どういう文字列にマッチングさせたいのかいまいち分からない
531 :
520 :2011/09/18(日) 16:37:15.08
(?=)は先読みなのでパターンの前に書くなら、戻り読み(?<=)使わないと。 それと[^A-Z]*[A-Z]にマッチしないのは[^A-Z]のみの連続。11-12-20など。 以上 <おじゃましました>
532 :
519 :2011/09/18(日) 17:10:05.69
>>527 >(?(?=[^A-Z]*[A-Z])\d{2}-[A-Z]{3}-\d{2}|\d{2}-\d{2}-\d{2})
>だと、おっしゃられるようにたとえば条件式が真の場合の12-abc-34とか、
大文字小文字が合っていないが? 通常大文字小文字は区別される。
535 :
519 :2011/09/18(日) 20:33:03.70
>>534 正規表現の大文字小文字はどちらでも結果は一緒でした。
どなたかこのソフトできちんと条件付正規表現が動くか試していただけません?
なんか意味がわからないです。
リネーマならRubyやPythonで書いた方が速いかもよ ここプログラマ板だし
s/プログラマ/プログラム/
538 :
520 :2011/09/18(日) 20:40:49.13
●正規表現の使用環境 Flexible Renamer ●検索か置換か? 置換 ●説明 日付の前の文字を入れ替える ●対象データ ABC11-12-31 \d{2}-[A-Z]{3}-\d{2} ABC11-DEC-31 \d{2}-\d{2}-\d{2} ABC2011-12-31 \d{4}-[A-Z]{3}-\d{2} ABC2011-DEC-31 \d{4}-\d{2}-\d{2} ●希望する結果 XYZ11-12-31 XYZ11-DEC-31 XYZ2011-12-31 XYZ2011-DEC-31 ●コメント:こんな感じか書いて投稿してみた
>>538 条件分岐を使う必然性が感じられないな。対象データはなんか合ってないし。
ABC(?=\d{2}{1,2}-(?:[A-Z]{3}|\d{2})-\d{2}) → XYZ
でいいんじゃね?
540 :
539 :2011/09/18(日) 21:01:10.78
あ、
>>520 さんは質問者ではなかったか。勘違い。
●正規表現の使用環境 一般社会 ●検索か置換か? 検索 ●説明 すぐにやれる女を見つけたいです ●対象データ OL 女子大生 女子高生 キャバ嬢 ヘルス嬢 近所のおばさん 母親 ●希望する結果 させこ やりまん 公衆便所
>すぐにやれる女を見つけたいです お前には一生涯マッチしないっ!
>>527 横、亀ですまんが、バグじゃないよ。
普通にマッチする。
マッチするだろうと思っている対象データがおかしいんでないの。
蛇足かもしれんが、
>>520 で書かれてる
D12-03-11
はマッチしないよ
ごめん。D12-03-11マッチするね。かさねてごめん。
546 :
デフォルトの名無しさん :2011/09/23(金) 14:38:20.95
^
http:// (?!yahoo\.co\.jp)[^/]+/(?!.*\.(?:jpg|gif)$).*$
ちょっと修正
^
http:// (?!(?:[/]+\.)?yahoo\.co\.jp)[^/]+/.*(?!\.(?:jpg|gif))$
549 :
デフォルトの名無しさん :2011/09/23(金) 15:26:19.22
(.(?!\.(jpg|gif)))*$ にしないとだめぽ
551 :
デフォルトの名無しさん :2011/09/23(金) 18:03:40.59
552 :
デフォルトの名無しさん :2011/09/23(金) 18:32:13.71
あ、できました! (?!yahoo\.co\.jp)([-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#](?!\.jpg|\.gif))*
^
http:// (?!(?:[/]+\.)?yahoo\.co\.jp)[^/]+/(?!.*\.(?:jpg|gif)$).*$
これでおk
(う|ち|ま)んこ
^
http:// (?!([^/]+\.)?yahoo\.co\.jp/)([^/]+/)+[^.]*(?!.*\.(jpg|gif)$)
やってみた
556 :
デフォルトの名無しさん :2011/09/24(土) 01:19:43.58
他の拡張子でも検索されてしまう
こういう場合は二回に分けるのがセロリ
逆に考えて、
http:// (?:(?:[^/]+\.)?yahoo\.co\.jp/|[^/]+/.+\.(?:jpg|gif)$)
にマッチしないものを検索とかじゃダメなのかな?
559 :
519 :2011/09/24(土) 16:28:10.96
>>543 お返事ありがとうございます。
そうですか。対象データがおかしい、というのがよく分からないのですが、うちでは
・アプリケーション Flexible Renamer v8.4
「高度なリネーム」「正規表現」
・検索の正規表現
(?(?=[^a-z]*[a-z])\d{2}-[a-z]{3}-\d{2}\|\d{2}-\d{2}-\d{2})
(?(?=[^A-Z]*[A-Z])\d{2}-[A-Z]{3}-\d{2}|\d{2}-\d{2}-\d{2})
・OS Win7 HomePremium 64bit
・対象データ たとえば以下の例
d12-03-11.pdf、12-03-11.pdf……ともにマッチせず。
22-asd-12.pdf……マッチする
でNGです。状況を再現したいので、ぜひ実験の詳細を教えてください。
>>559 543ではないが、
>・検索の正規表現
> (?(?=[^a-z]*[a-z])\d{2}-[a-z]{3}-\d{2}\|\d{2}-\d{2}-\d{2})
"|"の前の"\"は不要だよね
それからリネーム方法:−正規表現の右側のボタンを押して、
大文字と小文字を区別するとわかってくるかもしれない
>>559 ×12-03-11.pdf
○12-03-11
○d12-03-11
>>560 、
>>561 ありがとうございます! やっと望む結果が出ました! このソフト、拡張子は除外するものと
思い込んでいたことがまずかったみたいです。12-03-11.pdfだと、真の条件でマッチさせる
ことになって、偽の場合になってなかったことが原因のようです。
それに加えて正規表現のスペルミスとかもしてたのかもしれません。スペルミスを防ごうと
WEBからコピペしてたんですが、逆にそれがアダになりました。
たいへん、たいへんお騒がせしました。とても勉強になりました。ありがとうございます。
●正規表現の使用環境 Perl5 or Javascript ●検索か置換か? 検索 ●説明 ダブルクオートに囲まれた文字列を取得したい ただ、「\」の次の文字はエスケープされた文字として扱う ●対象データ "hogefuga" "hoge\"fuga" "hoge\\"fuga" ●希望する結果 hogefuga hoge"fuga hoge\ 上記のようなありきたりな命題にトライしていたのですが、以下の正規表現のうち1ではうまくいくのに2ではうまくいきませんでした 1. /"((?:(?:\\.)|[^"])*)"/ 2. /"((?:[^"]|(?:\\.))*)"/ ただ、僕にはこれが両方同じ意味に見えるのです なぜこの場合、2ではうまくいかないのでしょうか 気になって眠れません 詳しい方解説お願いします
>>563 \ は [^"] を満たしますから、(?:\\.) は永遠にパスしません。
>>563 寝ちゃったかな?
パターン1|パターン2 のとき、パターン1のマッチを調べてダメだったらパターン2のマッチを調べるってことですよ。
ところで、結果はこうですよね。
hogefuga
hoge\"fuga
hoge\\
>>564-566 なるほど!
2では[^"]がエスケープまで食ってしまってたわけですか
/"((?:[^"\\]|(?:\\.))*)"/
なら同じ意味ですね
分かってしまえばなぜこんなことで悩んでいたのか・・・
これでゆっくり眠れます!
ありがとうございました
568 :
555 :2011/09/25(日) 08:29:07.36
>>553 その前の人のレスからいろいろ勉強になった。(※)
^
http:// (?!([^/]+\.)?yahoo\.co\.jp).+/(?!.*\.(jpg|gif)).*
bregonig.dll Ver.1.43 with Oniguruma 5.9.1
sakura Ver.1.6.4.0 (※)C#で試したかったが、だれかソースくれないか?
>>557 前後に分けるとこうなる。
^
http:// (?!([^/]+\.)?yahoo\.co\.jp).*
.*/(?!.*\.(jpg|gif)).*
569 :
デフォルトの名無しさん :2011/09/25(日) 22:36:07.14
>>568 >^
http:// (?!([^/]+\.)?yahoo\.co\.jp).+/(?!.*\.(jpg|gif)).*
これでOKそうすな・・・
小文字英字、大文字英字、数字、「@_#」、のどれか3つが入っているかの条件は正規表現で可能でしょうか? どれか3つのやり方がわかりません。 以下は全く動作せず… ^(?=(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])|(?=.*[A-Z])(?=.*[a-z])(?=.*[@_#])).*$
^(?:[^0-9A-Za-z#@_]*[0-9A-Za-z#@_]){2}[^0-9A-Za-z#@_]*$ 言ってることがよく分からないけどこういうこと?
>>571 説明が下手くそですみません。
各パターン4種類の内、必ず3種類以上なのです。
なので頂いたものだと必ず3種類以上にならないので、他のパターンが必要です。
次のように24通りを列記すれば良い。 逆に言えば列記しないとダメじゃないかな。 ^(.* ([A-Z].*([a-z].*[0-9@_#]|[0-9].*[a-z@_#]|[@_#].*[a-z0-9]) |[a-z].*([A-Z].*[0-9@_#]|[0-9].*[A-Z@_#]|[@_#].*[A-Z0-9]) |[0-9].*([A-Z].*[a-z@_#]|[a-z].*[A-Z@_#]|[@_#].*[A-Za-z]) |[@_#].*([A-Z].*[a-z0-9]|[a-z].*[A-Z0-9]|[0-9].*[A-Za-z]) ).*)$ 長いので入れた改行は無視してね。
そんなの正規表現一発でやろうとすんなよ
正規表現エンジンが何かわからんけど、鬼車ならこんな感じ? ^((?-i)(?=.*[A-Z])((?=.*[a-z])(?=.*[0-9])|(?=.*[a-z])(?=.*[@_#])|(?=.*[0-9])(?=.*[@_#]))|(?=.*[a-z])(?=.*[0-9])(?=.*[@_#])).*$ 最初の(?-i)は大文字小文字を区別
>>572 24パターンをorで繋げるしかない
どう考えても効率が悪いと思うが
>>574 同意。perlなら、こんな感じか。
$_='hogehoge';
if (/[A-Z]/ + /[a-z]/ + /[0-9]/ + /[\@_#]/ >= 3) { OK }
Jscriptであるフォルダにあるpdfファイルを「フォルダ名_設計図.pdf」というようにしたいのだけど 先読み肯定で使った正規表現のグループのフォルダ名を置換文字列に使うことってできるんでしょうか? なんどやってもできないんだけど、、、、、、
(?=フォルダ名) ってなってるなら (?=(フォルダ名)) ってやる てか、どう書いてダメだったか書いてくれると助かるなぁ。 上記のように書いてもダメだったとか言われると寂しいし。
>>579 スクリプトが手元になくてスペルミスとかしてたらややこしくなるので書きませんでした。できるのか。頑張ってみます。
ありがとうございます!
>>579 書き込みしてから気づいたけど
(?=(フォルダ名)別の文字列)
としてます。これがだめなんでしょうか?
582 :
デフォルトの名無しさん :2011/10/04(火) 10:20:36.31
お前の目は節穴か? 窓の外を見ろ
583 :
582 :2011/10/04(火) 10:21:37.16
誤爆スマソ
フォルダ名をわざわざキャプチャする必要あんのかこれ 変数に格納されてるやつをそのまま使えばいいんじゃないの?
>>584 WSHのJscriptでそんなことできるん? できるなら教えてくれ。
結局WScript.argument(0).split("\\").slice(-2,-1)とかなんとかやってごまかそうかなと思っているけど。
具体例をあげてみたらどうだろう。 できるできないのどっちかもわかると思うし
587 :
デフォルトの名無しさん :2011/10/04(火) 23:05:06.46
正規表現の配列があって各正規表現にIDが振ってあります。 ある入力について、どれかの正規表現がマッチするならそのIDを返す! というのを効率的にやるテクニックとかないでしょうか。 前方一致ならトライ木を使うのですが 正規表現の場合にどうするのがいいのか分からない。 言語はrubyを使っています。
588 :
587 :2011/10/04(火) 23:23:07.32
>>587 > p Regexp.new("(pattern1)|(pattern2)|(pattern3)").match("pattern2")
#<MatchData "pattern2" 1:nil 2:"pattern2" 3:nil>
()と|で結合したあと、MatchDataを1からlengthまでみてnil以外がヒットした正規表現の添え字+1か。
きっとエンジンが効率よくやってくれそうだし、解決しました。
589 :
587 :2011/10/04(火) 23:39:38.93
patternの中に()があると$nがずれるのでだめでした。
もしその()をあとで使う予定がないのなら(?:)にして捨ててしまえばいいと思う
>>587 そういう時こそ名前付きキャプチャ
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
re_table = { :one => /(?<one>a+)/, :two => /(?<two>b+)/, :three => /(?<three>c+)/ }
re = /\A(?:#{Regexp.union(*re_table.values)})/
%w(abc bca cab).each do |s|
match = re.match s
p match
re_table.keys.each do |name|
p match[name]
end
end
outputs:
#<MatchData "a" one:"a" two:nil three:nil>
"a"
nil
nil
#<MatchData "b" one:nil two:"b" three:nil>
nil
"b"
nil
#<MatchData "c" one:nil two:nil three:"c">
nil
nil
"c"
592 :
デフォルトの名無しさん :2011/10/05(水) 16:34:14.94
性器表現
ボウヤ、それ面白いと思ってるの?
正規表現は、既出かどうかってのがわかりにくいね。 ●正規表現の使用環境 Java1.6 ●検索か置換か? 検索 ●説明 変数文字列とその添字の取得 ●対象データ $AAA.BBB+$CCC.DDD.EEE(1234)-#FFF*#GGG.HHH(567) ●希望する結果 検索1回目 group1 : $AAA.BBB 検索2回目 group1 : $CCC.DDD.EEE group2 : 1234 検索3回目 group1 : #FFF 検索4回目 group1 : #GGG.HHH group2 : 567 ($.*)\\(([0-9]*)\\) これで、$CCC.DDD.EEE(1234)をみつけれるのは出来たけど、添え字が無い場合を引っ掛けるのができない。
添え字を検索してる部分のケツに「?」つけてみたら?
>>595 御幣があったかも。
($.*)\\(([0-9]*)\\) これで
$CCC.DDD.EEE(1234) この文字列から
group1 : $CCC.DDD.EEE
group2 : 1234
といのが取れるところまで出来てて
$AAA.BBB+$CCC.DDD.EEE(1234) この文字列から
1回目
group1 : $AAA.BBB
2回目
group1 : $CCC.DDD.EEE
group2 : 1234
という結果を取得する方法がわからない。
(\$[A-Z]{3}(?:.[A-Z]{3})+)(?:\(([0-9]+)\))?
>>597 ありがとう。でも、上手くいかなかったよ。
後、伝え方が悪かったので以下のフォーマットなのでピリオドがかならず入るというわけではないのと
3文字という縛りも無い。
$[変数名](添字)
$[変数名]
([$#][\w.]+)(?:\((\d+)\))?
なんでこのスレに質問に来る奴って、 正規表現の前に、日本語での意志疎通能力を身につけろ って感じの奴が多いの?
>>601 答えてるやつも同じような感じだからいいんじゃね?
604 :
599 :2011/10/10(月) 22:16:37.55
>>601 まったく同じくことを感じていたよ
質問者の文章に戸惑いを覚えつつ、テキトーに回答してみた
2ch内だとこのスレはまだマシな方でしょ
御幣もち食いたくなった
605 :
デフォルトの名無しさん :2011/10/11(火) 09:58:42.99
●正規表現の使用環境 C# ●検索か置換か? 検索(完全一致) ●説明 ・擬似ワイルドカードもどきを作成したい。 ・ワイルドカードには"?"のみを10回連続で使用可能、"*"は不可。 ・対象データは"'(シングルクウォート)"ではじまり"'(シングルクウォート)"で終わる。 ・'(シングルクウォート)内であれば、"?"は複数箇所で使用可能。 ・ワイルドカード以外の文字(列)は仮で"○"として考える。 ●対象データ ex.) '○○???' '???○○○' '???○○○???' '○○???○○○' '○○???????????○○○' ●希望する結果 '○○???' ←match '???○○○' ←match '???○○○???' ←match '○○???○○○' ←match '○○???????????○○○' ←unmatch(?が11回連続)
[^?]\?{1,10}[^?] ?
607 :
605 :2011/10/11(火) 11:44:00.71
>>606 それだと
>'???○○○???' ←match
にマッチしないと思うのですが。
また、対象データはあくまで例であり、
'???○○○???○○○???○○○???○○○???○○○???○○○???・・・'
というように繰り返す可能性もあり、開始と終わりは"'(シングルクウォート)"です。
11回連続の物にマッチする物を探して マッチした物をアウトとする方が楽じゃないの?と思ってしまうのだが
>>605 '[^?]*?{1,10}(?:[^?]+?{1,10})*[^?]*'
610 :
605 :2011/10/11(火) 13:20:11.12
>>610 >>609 じゃないけど
'[^?]*\?{1,10}(?:[^?]+\?{1,10})*[^?]*'
612 :
605 :2011/10/11(火) 15:20:38.75
>>609 >>611 (?:)がどうとかではなく、単に?のエスケープが必要だったんですね
ありがとうございました。
追加の要望で申し訳ないのですが、
>>605 、
>>607 の条件に加えて
・'???'等ワイルドカードのみ、'○○○'等ワイルドカード文字("?")なしはNomatchとする
とした場合はどうなりますか?
擬似ワイルドカード表現が正当なものかチェックしたいのかな。
追加の要望は別の用途なのか、改良なのか。
>>611 だと今でも'ABC'にマッチしないけどいいの?
というかさ、正規表現一発で終わらせようとすると、正規表現自体が思惑通りの結果を
出してるかどうかのチェックに悩まされたり、思わぬバグ混入になるやもしれないよ。
''(空文字)とか'A'B'とかやその他の文字列に完全マッチ/部分マッチしないかとか、
?終わり/始まり、1文字のみはどうかとかね。
実際、あなたも回答者もチェックしきれてないでしょ。
一発で終わらせようとせず、チェック項目ごとに何段階かに分けて処理した方がいい。
>>608 の提案もグッドだと思う。
(?:)は記憶(キャプチャ)しないグループ。
繰り返しの\1とか、置換の$1とかに入らない。
繰り返しや置換を使わない場合、ただの飾りです。
614 :
609 :2011/10/11(火) 17:35:31.78
>>611 フォローthx
>>612 '(?!\?*')[^?]*\?{1,10}(?:[^?]+\?{1,10})*[^?]*'
>>613 あとで使わないことを明示することでメモリ節約および速度向上が見込めるよ。
微々たるものの場合が多いけど、クセ付けるとよいかと。
616 :
デフォルトの名無しさん :2011/10/12(水) 18:28:29.06
性器表現
定期的に湧くな
bbspinkに姉妹スレでも作るか
●正規表現の使用環境 Windowsコマンドプロンプト、filestr ●検索か置換か? 検索 ●説明 全角英の大文字または小文字または全角数字が含まれているか検索したい ●対象データ 以下batで失礼します set a="Ape" set b="Bape" set c="222" ●希望する結果 %a%、%b%、%c%から検索して、"Ape"、"Bape"、"222"、という結果を表示できるようする正規表現または、それを含めたコマンド ●試したコマンド echo %a%|findstr /r "[A-Z]" echo %b%|findstr /r "a-z" echo %c%|findstr /r \[0-9\] echo %c%|findstr /r "\[0-9\]" echo %a%|findstr "[A-Z]" echo %b%|findstr "a-z" echo %c%|findstr a-z findstr /r [A-Z] %a% findstr /r [a-z] %b% findstr /r [0-9] %c% 上記のコマンドは間違っていて結果が全て空欄になっています。正しい場合は set d=" あああ" echo %d%|findstr /r /c:"^. ." こちらの画面を見て頂ければと思います。それではどうかよろしくお願いします。
>>620 set a="111"
set b="Ape"
echo %a%|findstr "[0123456789]"
echo %b%|findstr "[ABCEDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]"
>>621 成功する事ができました。ありがとうございます。
"-"は始点と終点の全てを含むみたいな意味では無かったのですね。
なるほど・・・勉強になりました。
>>622 始点から終点のすべてを含むであってるよ。
ただ、文字クラスがマルチバイトに対応していないんじゃないかな。
echo "a" | findstr "[B]"
このとき、 a(0x61) は [B] ([0x8161]) にマッチしてしまう。
624 :
デフォルトの名無しさん :2011/10/14(金) 18:20:41.89
過去ログなんて1ヶ月も経てば忘却の彼方か... (
>>546 -)
つか、それって「".jpg"も".png"も含まないURL」の検索だよな。
拡張子限定にはなってない。
まぁ実際の運用上問題になることはほとんどないだろうけど。
629 :
624 :2011/10/14(金) 22:03:23.94
>>628 返す言葉もありません、申し訳ない
(?!)をうまく使えば行けるか?ということまでは分かったので
後は自力で頑張ってみます、すみませんでした
>>623 亀レスで失礼します。
どうもありがとうございました。確かに半角であれば"[A-Z]"など使えるみたいでした。
/rと書いてましたがデフォで正規表現の状態だったのですね。
あれから安心しきっていたのですが、全角が使えなかったのは
文字クラス[]がマルチバイト文字に対応していないとのことで
ちょっと真剣に精査してみます。ちょうどマルチバイト文字が疑問でした。
(調べていた時にa(0x61) は [B] ([0x8161])といった表現を良く見た気がしたので )
原因追究までどうもありがとうございました。大きく前進できました。
632 :
デフォルトの名無しさん :2011/10/17(月) 20:31:29.89
正規表現を使って2ちゃんねるメニューのカテゴリ周りの太字や改行のHTMLタグを外したいです。
※1----------------------------------
<BR><BR><B>地震</B><BR><A HREF=
http://headline.2c.2ch.net/eq/ >臨時地震</A><br> ... 緊急自然災害</A><BR><BR><B>おすすめ</B><BR><A HREF=
http:// ....
↓
地震<A HREF=
http://headline.2c.2ch.net/eq/ >臨時地震</A><br> ... 緊急自然災害</A>おすすめ<A HREF=
http:// ....
--------------------------------------
そのため以下のように正規表現のコードを作りました。
str.replace(/<BR><BR><B>(.+)<\/B><BR>/, '$1');
実行したところ、
※2----------------------------------
地震</B><BR><A HREF=
http://headline.2ch.net/bbynamazu/ >地震headline</A><br><A HREF=
http://toki.2ch.net/namazuplus/ > ...
--------------------------------------
のようになり、メニューデータ中の先頭の"<BR><BR><B>"と末尾の"</B><BR>"を見てしまっているらしく、うまく動作しませんでした。
データを分割してその都度処理をかけようかとも思いましたが、いまいち効率が悪そうです。
どのように書けば※1のように動作させられるのでしょうか?
実装言語はJavaScriptです。
634 :
デフォルトの名無しさん :2011/10/17(月) 21:29:30.86
JavaのStringについてですが str.matches("^[a-zA-Z0-9\\(\\)]+$"); というように()を判定したいのですがエラーになってしまいます。 ()はどのように指定すればよいでしょうか?
>>635 str.match(/^[a-zA-Z0-9()]+$/)
>>636 それってJavaScriptじゃないでしょうか?
>>635 []で指定する時はエスケープいらなかったはずだけど
>>638 str.matches("^[a-zA-Z0-9()]+$");
>>641 エラーが出るってのは例外でてるってことでいいの
そうっす
これはひどい質問者だな
JavaのStringのmatchesは完全一致らしいけど とりあえずこれはtrueになるね "int fooABC123(void)".matches("[a-zA-Z0-9() ]+"); "\\".matches("\\\\");
>>634 なかなか初心者向きのページで、これからって人にいいね。
ちょっと勉強してくる
647 :
デフォルトの名無しさん :2011/10/27(木) 00:36:45.31
<hoge>aaa</hoge> bbb <hoge>ccc</hoge> <hoge></hoge>に囲まれてる文字を大文字に置き換える処理をしてるのですが、 <hoge>(.*)</hoge>で一応できます。 <hoge>(.*)?</hoge>と?をつけてもできるのですが、 どっちが正しいのでしょうか?
648 :
647 :2011/10/27(木) 00:45:02.81
ちなみに言語はPHPでpreg_replaceで最初にマッチした1つではなく、マッチしたものの全置き換えをしています。
ちゃんとやるなら ([^<]+)こうすべきだろ
[[$〜$]] 〜の部分を取りたいのですが [[$test$]]$]]のように 〜の部分にも$]]を含む場合 test$]]を取りたいのですが こういう場合はどういう記述をしたらいいのでしょうか?
>>650 [[$test$]]$]]$]] のときは?
[[$test$]]$]]$]]$]]$]]$]]$]]$]]$]]$]] のときは?
652 :
650 :2011/10/27(木) 03:02:31.73
>>651 >[[$test$]]$]]$]] のときは?
test$]]$]]
>[[$test$]]$]]$]]$]]$]]$]]$]]$]]$]]$]] のときは?
test$]]$]]$]]$]]$]]$]]$]]$]]$]
です。
[[$〜$]]は文章中に1箇所だけではなくいくつかあります。
最長一致でいいなら普通に取ればよくね?
654 :
850 :2011/10/27(木) 04:42:40.78
>>853 最長一致がどういうことかはよくわかりませんが、
言葉の意味通りに捉えると
[[$test$]]$]]あいうえお[[$test2$]]の時
『test$]]』と、『test2』の2つに一致してほしいわけですが
『test$]]$]]あいうえお[[$test2』に一致してしまわないでしょうか?
もし違ってたらすみません。
じゃあ[以外が続いて$]]でよくね
656 :
650 :2011/10/27(木) 07:41:09.65
ありがとうございます。 教えていただいた方法で大丈夫そうです。
657 :
647 :2011/10/27(木) 09:23:05.93
>>649 レス遅くなってすみません。
(.*)に<が入ってることも考慮したいのですが、
その場合はどうしたらいいでしょうか?
<hoge>hoge</hoge></hoge>
みたいな感じのとかです。
すいません、ものすごく初歩的なのですが URL変換の正規表現についてお伺いしたいです。 <rule> <from>category/(.*)\.html</from> <to type="forward">/servlet?action=category&type=$1</to> </rule> は正常に動作するんですが、パラメータが複数の場合が解りません。 <rule> <from>category/【(.*)\】/(.*)\.html</from> <to type="forward">/servlet?action=category&type=$1&type1=【$2】</to> </rule> 【】内はどのように指定すればよろしいですか?
>>657 <hoge>([^<]+?)</hoge>
>>659 たぶん
hoge</hoge>
が取りたいって言ってる
>>657 <hoge>((.(?!<hoge>))*)</hoge>
>>658 category/([^/]+)/(.+)\.html
<hoge><hoge>aaa</hoge></hoge> ↓ aaa</hoge> をとりたいのか わけわからんな
それを大文字にすると AAA</HOGE> ? >(.*)に<が入ってることも考慮したいのですが、 考慮とは何を意味するのか分からないし、 そもそも質問者は正規表現が知りたいとは一度も言ってないな
abchjBFG以外の連続する文字というのはどう書けばいいでしょうか? [^d-gik-zAC-EH-Z]+ではだめなようでした
[d-gik-zAC-EH-Z]+でいける ちなみに[^abc]はabc以外の任意の一文字って意味
どうでもいいけど、それならむしろ[^abchjBFG]+の方が 否定すべき文字が一目瞭然でいいと思う。表現も簡潔だし。
[^abchjBFG]+は\b\0\0\bにもマッチするよ
668 :
664 :2011/10/29(土) 18:07:31.64
文字クラスの積を使っても良ければ、直接書けるけどね。 [A-Za-z&&[^a-chjBFG]]+
UTF8からSJISに変換する前に Category propertiesなどで、日本語の範囲内かチェックしておきたいのだけど 何処かに良い見本は無い?
672 :
デフォルトの名無しさん :2011/11/02(水) 16:58:54.60
URIの正規表現で質問させてください PHPにて英数字、エンコードした時の文字とか有り得る文字以外はValidateチェックにて弾きたいと思うのですが、どのような正規表現が書けるものなのでしょうか? [?&/%_-]*とかホワイトリスト的に書き加えようと思ったのですが、それ以外の有り得る文字列が分かりませんでした ・URI指示にてまず有り得ない文字が入っていたら排除したい ・NULLバイトなどセキュリティ的に問題があるものを排除したい そもそもNULLバイトの場合は正規表現で省くのではなく、preg_match('/\0/', $uri)などで弾くのかもしれませんが
PHPならなんか素敵な便利関数がありそうな気がするけど
>>673 最初、|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|iとしたのですがダメで、
Zend_Uriというライブラリがあるのですが、それ使っても普通にパスを通ってしまいました
で、自分で正規表現を使って・・・と思ったのですが、実力不足で・・・
ていうか今んとこ要求としては、とにかく、絶対にありえない文字がどっかに入ってるものを 排除したい、ということであって、バリデーションじゃないわけだよね。 だったら preg_match('/\0/', $uri) とかの羅列で弾いとけば?
やっぱ量指定子っておもくなるんだね。100万文字くらいある奴でかなり違った
環境によって重かったり軽かったりいろいろ。 A{100} AA{99} A{99}A (?:AAAAAAAAAA){10} AAA・・・AAA (100個) いろいろな書き方が出来るからその環境に合わせて最速の方法で書く。
>>678 おお。すごいね。こんなにいろいろ書き方あるもんなのか。
0パディングされてない1〜3桁の数字のみにヒットさせる正規表現ってどのように書けますか? ヒットする例 0 9 10 19 99 100 999 ヒットさせない例 00 000 09 010 019 099 0100 999
難しいな、999はヒットするけどヒットさせないのか。
すいませんヒットさせない例の999の部分は消してください
言語は問いませんが 例えば [0-9]|[1-9][0-9]|[1-9][0-9][0-9] とかけますけど もっとかっこよく書きたいんです
[1-9]([0-9]){0,2} しか思いつかないヘタレです
それだと0にヒットしない
[^0-9][0-9]([1-9]){0,2}[^0-9]
^[1-9]?[0-9]?[0-9]$
690 :
688 :2011/11/04(金) 13:03:11.06
駄目だった。。
691 :
688 :2011/11/04(金) 13:08:34.85
^([1-9][0-9]?)?[0-9]$ これならいけるか。
(?:[^0-9])([0-9](?:[1-9]){0,2})(?:[^0-9]) (?<=[^0-9])[0-9][1-9]{0,2}(?=[^0-9])
ああ、普通に01にひっかかるな
(?<=が使えなきゃ無理じゃない?なんの言語でやるのかは知らないけど。
とはいえ、
>>691 だと
hoge123fuga
に引っかからない
696 :
688 :2011/11/04(金) 13:27:54.83
あら、それもひっとしないといけなかったのか。。
(^(0|[1-9][0-9]*)$) じゃだめなん?
結局どうなったの? (?:0|[1-9]\d{0,2})
なんでみんな > 数字のみにヒット を > 数字のみの行にヒット って読みかえるの?
00が0と0の並びだったらとか考えたらキリがないからじゃないか
00はヒットしないって書いてるのに
結論的には
>>681 の書いてる事が曖昧なので答えは出ない
それは低学歴だから理解できてないだけ
>>705 高学歴の方。もう一度中学校で国語の勉強をし直しなさい。
0パディングされてない1〜3桁の数字のみ って書いてあるのに0とか数字以外にヒットさせたりとかバカが多いな
既に答えは出てる。
>>684 で解決できるそうだから対象は数字のみの文字列なんだろう。
perl準拠の拡張正規表現でいいんなら・・ (?<!\d)(?:0(?!\d)|[1-9]\d*)
>>681 ,684
^(?:\d|[1-9]\d{1,2})$
(?<!\d)(?:\d|[1-9]\d{1,2})
>>709 4桁の数字にHITする問題がある
711 :
710 :2011/11/04(金) 18:06:58.76
失礼、
>>710 を訂正する。
^(?:\d|[1-9]\d{1,2})$
(?<!\d)(?:\d|[1-9]\d{1,2})(?!\d)
>>710 ああ、3桁しばりがあったんですか、見落としてました・・。正解は
>>711 で合ってると思います。
あれ、よく見ると合ってないですね。perl準拠の拡張正規表現での正解は↓だと思います。 (?<!\d)(?:0|[1-9](?>\d{0,2}))(?!\d) (?> ) は使わなくても誤作動はしませんが付けるのが正しい書き方だと思うので付けてあります。
あれ、
>>711 も合ってますね。勘違いしました。失礼しました。
一桁と二桁以上の数字を別処理としてマッチさせてるんですね、その発想は無かった。
これだけ回答が出ていて
>>681 ,684は放置するのか…
正直言ってどの回答も
>>684 よりかっこわるいからな…
実装する立場からは
>>684 が FA でいいよ、もう。
>>584 は "1000" にマッチする上、[0-9] がださいし、不完全な部分一致になってるし、どこがかっこいいと思ってるのかさっぱりわからない件
Finite AutomatonなのかFinal Answerなのか
Falsy Answer
>>681 =
>>684 てことでいい?
>>681 の回答例が
>>684 ということで、これは
「与えられた文字列全体がパターンに一致するか真偽を判定する」
問題なのであって、
「走査して位置を求める」
問題ではないということで異議はない?
Javaでいうとこのmatchesとfindの違いか。
テンプレのジャンルには検索と置換しかないんだけど、「判定」も足そうぜー
正規表現は見た目どうこうではなく期待通りの動作をするか否かが大事。正しい動作をさせるために
見た目が長く汚い物になることも多々あります。
>>711 のものは非常によく出来てると思いますよ。
>>720 たとえばって書いてることを考慮できないってのはひどいもんだな
せっかくいいものを作ってもらってるのに使わないなんてもったいないなぁ。なんのために質問したのかと。
最初からおちょくるつもりだったんだろ
>>684 と等価でよりかっこいい答えが求められているだけの話だろー
オレオレ要件でよってたかってエスパー回答するのも楽しい話ではあるが。
漫画の見すぎってやつか。俺はもっとかっこいい剣が欲しいんだ!みたいな。
728 :
727 :2011/11/06(日) 00:57:51.72
String regex = "
http://some_website.net/category: ([0-9]+)\">";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
Matcher m = p.matcher(html);
if(m.find()) {
// 上のregexの([0-9]+)の部分を取得したい
}
よろしくお願いします。
729 :
727 :2011/11/06(日) 01:30:21.23
Matcherのgroupメソッドで解決しました。 お騒がせしました。
730 :
デフォルトの名無しさん :2011/11/07(月) 21:14:56.26
>>279 に似たような質問があるのですが、
PHP5.3.8にてDOMDocumentにてHTMLファイルを取得し、<body>内のテキストだけを抽出したいです。
タグ部は正規表現で除去出来ますが、問題になるのは<script>でJavaScriptの中身が表示される、<!--などのコメントが表示される事です。
で、<script>とコメントを含む部分を先に除去したいと思います。
/<script[^>]*?>.*?</script>/si
とかやってみたのですが良く分かりません。
アドバイスまたは似たような事を書かれているサイトなどを教えて頂けないでしょうか?
>>730 PHPスレいっておいで
正規表現使わずにできるから
734 :
670 :2011/11/08(火) 10:18:31.06
m/(?:(?:\p{Hiragana}|\p{Katakana}|\p{Han}|\p{Latin}|\p{Common}) (?:\p{Inherited}|\p{Me}|\p{Mn})?)+/x;
735 :
デフォルトの名無しさん :2011/11/08(火) 22:56:34.23
性器表現
∧∧ (д`* ) (⊃⌒*⌒⊂) /__ノωヽ__)
737 :
デフォルトの名無しさん :2011/11/10(木) 14:52:38.32
皆さんは区切り文字のデリミタにはどの文字を使っていますでしょうか? "/"だとURIなどでエスケープしなくちゃいけなくなり、見にくくなりますが "!"とか"@"とか使う可能性が少ないものがいいと思うのですが、どんな文字がいいのでしょうか 皆さんの使っている文字を教えて頂けないでしょうか?
>>737 その時の状況(エスケープの手間や可読性等々)で使い分けてるから、
「この文字がいい」という提案は不可能。
ナル
>>738 でも使う文字ってそんなに種類ないでしょ?
>>740 まあ「記号類のどれか」であることは確かだわな。
一文字に限るから困るんだ、という回避方法をとってるものも割とあるよ。2chとか。
!も@も使われるしな。安全なデリミタなんて無いわな。
ASCIIコードでは0x1Cから0x1Fまでを ファイル、グループ、レコード、ユニット の順で「セパレータ」と定義しているぞ。
なぜそれらを使うに値しないかの理由を言わずに否定するのはおかしいから、それらを使うのが当然ってことかぁ
矛盾する?単語羅列がいいよ 記号でやるのは古い 例えば「男爵伯爵」とか
>>748 Googleでは引っ掛からなかった。 「男爵伯爵」
>>749 引っ掛からないのは使えるって事だしね
googleで検索するのはいいね
なるほど、じゃあ都道府県にしようかな
やっと指定したパターンを含まない行の検索の書き方が理解できたわ ^((?<!abc).)*$ これね。
何に使おうとしてるんだろう。
abcだけの行に引っ掛かったが良かったな。
>>753 テキストエディタでgrepのまねごとするために使う
これで消せばパターンの行だけ残る、という奴
>>754 ほんとや・・・
なんてこった
>>755 エディタによっては否定ができて楽なんだけどね
^(?!.*abc).*$
文字列を含まないってかなりごちゃごちゃすると思うんだけど
VSの正規表現がそれに近い .NETじゃなくてVSのIDEに実装されている方ね
論理的な作り方さえ学べばそんなにむつかしくはないよ、ごちゃごちゃはするけれど。
●正規表現の使用環境 MySQL4.1のREGEXP ●検索か置換か? 検索 ●説明 カラム内に <> を含むテキストデータがあるのですが 調べたい数字が入っているかを調べたい ●対象データ 3<>4 5<>32<>2 5<>3<>6 3 4 この中から3を含むものを検索したい(32はヒットしないように) ●希望する結果 3<>4 5<>3<>6 3
>>762 ^([0-9]+<>)*3(<>[0-9]+)*$
>>764 ありがとうございます! ばっちりでした。
>>763 1行が1レコードのつもりで書いてました。
結果はヒットするレコードってことで
否定文なんですが 行頭に特定の文字(★や◆など。文字列じゃないです)が入ってる場合は行末まで無視して それ以外は行末まで強調させる、という条件はどんな風になるでしょうか? ★や◆の場合のみ一行全てを表示させるものは作っているのですが、否定文になるとなんか難しい…… ソフトはテキストエディタの秀丸です。 最初は順番変えたら何とかなりそうだと思ったんですが、どうも少々凝った否定文が必要なようで ここで質問させていただきます
ちなみに作ってる奴はこんな感じです [◆|★]+([亜-K]+|[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-za-z0-9]+|[\d0-9]+|[\d!”#$%&’()*+−¥、。…・※?〜:「」々人])+[$]
そのぐちゃぐちゃしてるところは.じゃだめなの? 要件を見ると行頭の特定文字以外には言及してないよね
ト書きのセリフとかかな。
>[亜-K]+|[一-龠]+ 何かキモい書き方だな。\pが使えるなら\p{Han}+としたいところだが。 行頭云々言ってる割に正規表現が ^ で始まってないとか、末尾の [$] は $ の間違いかとか、 ()の中の文字クラス全部まとめてしまっていいんじゃないかとか、つっこみどころがいろいろ。 で、行頭が★と◆以外の1行なら、 ^[^★◆].*$ でどうだ。
771 :
766 :2011/11/15(火) 00:49:22.72
すみません、自己解決しました。 厳密には解決はしてないのですが 色々と試してたら「 ^(★|◆).*$ 」で問題なさそうだったので、もう止めときます 否定で一行除くの難しすぎる…… 秀丸スレでも似た醜態を晒してしまい、申し訳ありません ゴチャゴチャしてたのは全ての文字に とにかく符合させようとしてパターンをありったけ突っ込んだ結果です
厳密にどうしたいのかを書いてればすっきりするのに
^([^\?]*)(.*)$ でいいんじゃないかなぁ
>>766 他のソフトで置換した方が早くね?
/^(!?(★|◆)(.*$)/<b>\1<\/b>/g
>>773 スレ違いだけど、ちょっとコメント。
mod_rewiteは正規表現だけのルールでは望む結果を得られないので、
マニュアルをちゃんと読むべし。 末尾のオプションの使い方が鍵。
JavaScriptで aa1 っていう文字列の塊を1セットで[a-z]{2}[0-9]と表します この文字列が fi1cs2bc3wr4 ってう風に4回繰り返されている場合にヒットさせる正規表現はどうかくのでしょうか? ([a-z]{2}[0-9]){4}って感じで書いてみたんですけど(〜){数字}のケースって見たことないんですがどうでしょうか
この手の人ってどうしてマッチするかどうか実際に試してみないんだろう。 何が減るわけじゃなし。2ちゃんに書き込む労力は払うのに。 煽り抜きで、本当にいつも不思議に思う。
自分が気に入らないと煽るクセは直したほうがいいよ
正規表現は正しいのですが.htaccessの問題ぽいので.htaccessスレで聞いてみます。
>>778 誰もが思うことを実際に口に出してツッコミ入れると損するよ。ツッコミ癖は直しておいたほうがいい。
ツッコミキャラほどうざいキャラはないからな。
まぁこのレスもツッコミレスなわけだがw
>>782 自治キャラのウザさは、遙かその上を行く。
いくら草を生やしても中和されない。
草がたりないってことは?
785 :
デフォルトの名無しさん :2011/11/16(水) 13:58:16.17
質問です。 文字ストリング「"山田","太郎",,"",,"自宅TEL","03-4567-8901"」から、 「"山田"」、「"太郎"」、「""」、「"自宅TEL"」、「"03-4567-8901"を取り出したいのですが、 対象を「.+?」で指定すると、 「"山田"」、「"太郎"」、「"",,"」、「","」が取り出されます。 どのような指定にすれば良いのでしょうか
786 :
785 :2011/11/16(水) 14:01:28.58
誤「.+?」⇒正「\".+?\"」です。
.*?にする
788 :
609 :2011/11/16(水) 14:49:26.15
>>785 CSVは一つの正規表現では無理
パースして順番にマッチしていかないと
789 :
785 :2011/11/16(水) 16:16:51.38
文字ストリング…
バイトストリングとかあるから別につっかからなくても
Excelできちんとインポートした方が早い気がする。
>>777 どうでしょうね
動くのを正としたいのか、もっとスマートにしたいのか
[0-9]は??dにできるし、正規表現に正解はないよ
そういえば前に[0-9]だと駄目で\dにしたらちゃんと置換できたことあった ()の指定とか複数あったからどこかしら書き間違ってたのかもしれんけど・・・
EBCDICな環境だったとか
>>794 まれに \d に対応しない実装もある
JavaScript は明らかに対応してるけどね
EBCDICは関係ないだろー。[A-Z] はなんかあるかもしれんが。
ごめん、そもそもEBCDICに "[", "]" は無かったな。
●正規表現の使用環境 秀丸 ●検索か置換か? 置換 ●説明 文字列の中に同じ文字が2つ以上含まれる行を削除したい ●対象データ aaaaaaaa abcabcab abcdefgh agbchddf cbfdaehg dbcahebg dffbdeha echfbgad fbadcaeh habcdefg ●希望する結果 abcdefgh cbfdaehg echfbgad habcdefg 見づらいかと思いますが どうかよろしくお願いします。
^.*(.).*(\1).*\n 一応対象データであがってる文字列ではうまくいった
>>799 検索: (^|\n).*?(.).*\2.*\n
置換: \1
>>801-802 助かりました!
バッチリな感じで動作中です
スッキリできました、本当にありがとうございました。
804 :
デフォルトの名無しさん :2011/11/19(土) 16:27:42.33
いえいえ
へ〜検索の中でも参照できるのか! このスレ勉強になるなw
出来る場合もあるが、出来ない場合もある。実装次第。
正規表現で start.*end これだと、startから最後のendまで取得してしまう start.*?end これだとstartの直近のendまで取得できる .*の後ろに?を付けると直近のendまでになる理由が理解できません 死んだほうがいいでしょうか(´・ω・`)
?を付けると最後のendまで検索したあとに手前にendがないかを戻りながら再検索します。 手前にもうendが見付からない場合には最後に見付けたendまでマッチすることが確定します。
>>807 正規表現は原則よくばりなマッチ(とれるだけとる)をするんだけど、この原則をひっくり返したものが、.*?
もしかしたら 「0個か1個」を意味するメタキャラクタの"?"で、どういう理屈で最短一致になるのか? という疑問かもしれん。 (量指定子)? という表現ひとまとまりで、最短一致を表す正規表現となる。そういう約束。 この場合の"?"は「0個か1個」を意味するメタキャラクタとは別物。 行頭を表す"^"と、文字クラス内で否定を意味する"^"とが別物であるようなもの。
SoftalkWEBっていう2chスレ音声読み上げソフト使ってます。
そこで、
>>9 ↑
みたいにレスに返事をする部分を
レス9へ返事
と変換したいのですが変換対象と変換結果をどのように指定すればよいでしょうか
>>812 安価以外の「『>』×1〜2+数字」にも絶対反応するけどそれはどうするの?
Javaでaaaa1.txt と bbbb2_2.txtというファイル名が有り、 aaaaと1、bbbb2_と2を抽出したい どう書いたらいい?
cccc22.txtだったらどうなればいいかとかいろいろ情報不足
一応考えたのは ((^[a-zA-Z_\\-]+)|(^[a-zA-Z_\\-]+[\\-_]))(\\d+)\\.txt$ です
訂正。2つめの[]の中に0-9を追加です
818 :
815 :2011/11/30(水) 01:10:35.02
ファイル名の最後の数字と分けたいってことでいいのかなぁ。それなら ^(.*?)(\\d+)\\.txt$ で$1と$2に入る。これは検索対象がファイル名であることを前提にしてる書き方だけどね。 これじゃだめなら何が足りないのか書いてね。
>>812 アンカーにはさまざまなパターンが存在し、
>>813 氏も心配しているような誤反応の可能性がありますが、
シンプル版でよければ。
===
変換対象
(?<=\n)>>([1-9]\d{0,3})(?=[ ])
変換結果
レス$1へ返事
===
アンカーが行頭に存在し、かつ、
アンカーの後ろにスペースが入っている(SoftalkWEBの仕様)場合に置換します。
以下のように、番号を複数指定している場合などには未だ対応できていません。
>>1 ,2
>>1-2 また、>>1みたいな全角文字にも対応していません。
他のSoftalkWEBユーザの参考になるし、機能追加の要望にもなるので、
SoftTalkのサポート掲示板の方に投稿したほうが良いと思いますが、、、
aの4回以上8回以下の繰り返し「 ^a{4,8}$ 」 ではなくて、 「aの4回または8回の繰り返し」 を ^(a{4}|a{8})$ のように「a」を2回使用せずに、「a」を1回だけ使用して指定する方法を教えてください。
^(a{4}){1,2}$
823 :
821 :2011/11/30(水) 14:36:25.94
^(a)\1\1\1(\1\1\1\1)?$
^((a)\2{3}){1,2}$
質問です。 性器の生気を正規表現でどうしましょうか?
^(a{4})\1?$
PHP Version 5.2.9 preg_matchです。 電話番号の認証として、 /^\d[\d\-]+\d$/D を使用していますが、 「1--3」のようなハイフン記号が続く場合の入力を許可してしまっています。 要件として、厳密な電話番号ルールは必要ではありません。 データとして「1-2-3」などを許可しています。 よろしくお願いいたします。
^\d+-\d+-\d+$
^(\d+-){2}\d+$
>>829 素直に書けばそういう感じですね。
目からウロコです。
目からウンコ?
>>830 こちらを使用します。
ありがとうございます。
正規表現は短ければいいってものじゃないからな、一応。短く書いたほうが処理が重くなるケースは多々ある。
835 :
814 :2011/12/01(木) 15:05:13.05
asdfg =~ /a|s|d|f|g/ こういうのが一番はやい。/(a-z)/より早い。でもめんどくさい。
837 :
デフォルトの名無しさん :2011/12/03(土) 20:22:32.94
こ う い う 風 に ス ペ ー ス を 間 に 何 度 も 挟 む ケ ー ス を 正 規 表 現 で や る と ど う す れ ば い い の か な
マッチさせたいってこと? ([^ ] )+
839 :
デフォルトの名無しさん :2011/12/03(土) 20:34:55.37
あ、なるほど!
841 :
デフォルトの名無しさん :2011/12/05(月) 16:10:59.60
●正規表現の使用環境 C# ●検索か置換か? 検索して、マッチしたものをキャプチャして置換したい。 ●説明 文字列の演算式の項をキャプチャして置換したい。 演算子には、+,*,()のみが使用可能。括弧の入れ子も可能。 ●対象データ(ex.) (aaa+bbb)*(ccc+ddd) があったとき、まず、aaa,bbb,ccc,dddをキャプチャして、 文字列変換(別途用意済)をする。 次に、それぞれ変換した文字列を元の式に戻す。 例えば、文字列変換が小文字⇒大文字への変換だった場合、 (AAA+BBB)*(CCC+DDD) としてたい。 実際には、 string strBefore = "aaa"; string strAfter = 変換メソッド(strBefore); という感じで、独自の変換メソッドを用意しています。 aaa*(bbb+ccc) ⇒ AAA*(BBB+CCC) aaa*((bbb+ccc)+ddd) ⇒ AAA*((BBB+CCC)+DDD)
正規表現使う必要無くね?
ただのstrupr処理だわなw
844 :
841 :2011/12/05(月) 17:27:54.69
>>843 struprはあくまで例です。
ここで複雑な変換処理の式を出しても混乱するだけだと思ったのでupperを出しただけです。
>実際には、
>string strBefore = "aaa";
>string strAfter = 変換メソッド(strBefore);
>という感じで、独自の変換メソッドを用意しています。
ここで事情は説明したつもりなのですが・・・
ふつう正規表現でやるのは項の定義止まりだよ
説明を簡略化しすぎても混乱してしまうよ。それと求めているのは正規表現そのものではなくて 正規表現のサンプルコードか何かのような気がするのだが・・。
847 :
841 :2011/12/05(月) 18:16:25.27
>>846 すみません、たしかにロジックの説明は余計だった気がします。
教えて頂きたい正規表現は、四則演算「っぽい」文字列にマッチするかどうかというものです。
マッチさえすれば、あとはキャプチャして置き換えればよいとの認識です。
宜しくお願い致します。
もとの制限を考えれば、+,*,() 以外の文字の連続がほしいものなんじゃないの?
>>844 文字列の中に式らしき部分があって、その要素(項)を別に定義した約束事で
置換するというのでいいのかな。
>>842 は
>>843 的な意味で書いたのではなく、文字列操作関数だけでも出来るんじゃないかと思ったので書いた。
正規表現でやったほうが楽だけどね、処理速度は遅いけど。
・項にはどんな文字が使われるのか、英字だけなのか、ひらがなや漢字、数字なども含まれるのか 例、時間*時給
(これがはっきりしないと書きようが無い)
・式の前後には改行は入っているのかいないのか
・全角文字には対応するのかしないのか 例、F+G
これらが分かれば簡単に書けるから誰かしらが作ってくれると思うよ。
あ、括弧の入れ子を厳密に判定しようと思ったら普通の正規表現では無理。鬼車っていうライブラリを使ってるなら 簡単に対応出来る。鬼車でない場合は文字列操作関数で頑張ったほうが正確に判定出来ていいかも。
使われる全ての文字の連続を検出すれば良い。 括弧が正確に対応するかは個別にCheck。正規表現使わなくていい。
>>853 ((((aaa+bbb)*ccc(ddd)
こういう括弧の数が合わないものは式でない可能性が高い。それを置換してしまってもいいのかな?
>>854 それを考慮するってことは、式の始まりまたは終わりを判断するつもりがあるということか。
それをしなかったら正規表現使う意味なくない?
だから正規表現いらなくねって意見がでてんでしょ
括弧の入れ子の判定は正規表現でやったほうが断然楽だわな。いらないと思う人はこれが出来ない人なんだろう。
859 :
841 :2011/12/06(火) 08:54:43.49
>>850 ご指摘ありがとうございます。
項はある検索エンジンで使用する独自の式が入ります。
"TERM"という定数に項を表す正規表現が記述されている、として頂ければと思います。
const string TERM = "●●"//●●←項を表す正規表現
式の前後に改行は入りません。
全角文字は、項の中ではありますが、+、*、(、)は半角のみを許可します。
よろしくおねがいします。
難しい問題の合間に箸休めでお答えください 数字の入っているファイル名を置換したいです。 あああいいい01.txt AABB0002.txt なむなむ003.txt TYTY4.txt ↓ THX001.txt THX002.txt THX003.txt THX004.txt .+(\d)(\d?)(\d?)(\d?)\.txt などと、いろいろ試してはみたんですがうまくいきません。 どうかお力添えのほどをよろしくお願いします
>>860 .+(\d)+\.txt
こういうこと?
>>851 鬼車つかって簡単に対応したのを書いてもらえますか
863 :
860 :2011/12/06(火) 17:48:58.84
>>861 レスありがとうございます。
条件をもう少しちゃんと書けばよかったですね
数字部分が0255などの時うまく置換できないのです。
数字部分だけで言うと、001,002,・・,255,・・880
のような形で置換したいです。
置換の方への記述の仕方もよくわからず、できればそちらもお願いいたします
865 :
860 :2011/12/06(火) 18:28:08.59
>>864 失礼しました
●正規表現の使用環境
psstpsstというリネームソフト(Perl互換)
●検索か置換か?
置換
●説明
最大4桁で書かれた数字部分を3桁に統一したい
●対象データ
ABCA01.txt
BCAA2.txt
CABA0255.txt
●希望する結果
AAA001.txt
AAA002.txt
AAA255.txt
どうぞよろしくおねがいします
数字部分を3桁以上にしてから (\d+\.) 000\1 下3桁だけ切り出し \d*(\d{3}\..*) \1
>>841 のは再帰を理解できるような拡張した正規表現を使えないとダメだろ。
そんなのあるのか。
で、再帰が使えると
>>854 が懸念するようなことも解決できるの?
理解してないができるはずだろ。マッチしないとき、括弧が足らないなどのエラーが判明する。
再帰的パターン
どうすればカッコに括られた文字列とマッチできるか、という問題を 考えて見ましょう。
このとき、カッコは何回でもネストできるとします。
再帰が使えないとすると、パターンを用いて、せいぜい、ある一定の深さの ネストまでしかマッチできないでしょう。
任意の深さのネストを 処理することは不可能です。
Perl 5.6 では、正規表現において再帰を行う 実験的な機能が導入されています。
PCRE では、再帰という特殊なケースに対して専用のシーケンス (?R) が導入されました。
http://php.net/manual/ja/regexp.reference.recursive.php
出来るよ、このスレでこんな認知度低いほうが意外なくらい。
windowsで手軽にpeclの動作確認する方法ありますか。
xampp入れてPHPですかね。
認知度の話じゃなくて、項には全角も含まれるといわれている状態で、再帰でできるとか言ってるのが斜めってることに気づかないのかな。 「たとえばほげほげ+fooという文字列」 ↑この中の項をどうやって判別するの。
全角や、英数のみはたいした問題でない。 どの文字を許可するかはそのつど変わる。
だから現状ではできない、でおk?
なんでよ? 文字コードの問題があるけど、たとえばUTF32などだったら英数も全角も同じバイト長で区別はない。
>>877 >>855 でも書いたけど、式の始まりと終わり、項と項以外をどうやって判断するの?
体重+年齢と性別*5
このとき、何が項として抽出されるべきかを書いてみ?
べつに
>>874 でもいいけど。
項に使える文字はあらかじめ指定するんだろ。 たとえば[0-9a-z]としてあとで変更することもできる。 全角になったとしてもたいした問題でない。
>>878 こうわけるのが普通だろ。他にどう分けるんだよ。
体重 + 年齢と性別 * 5
対象文字列が式のみかどうかなんて書いてないよな。
対象文字列が式のみであるという前提を勝手につけるなら、わざわざ括弧の整合性チェックをする必要なんてないよな。
>>882 いつまで雑魚の相手をするつもりなんだ?
項の部分は質問者さんが正規表現を作るのかな、
>>859 を読むとこう取れなくもないのだが。
>>850 で「はっきりしないと書きようがない」と言われてるのにはっきりさせないから混乱するんだ。
項は仮に[a-z0-9]でいいだろ。
888 :
860 :2011/12/07(水) 10:11:04.84
>>866 実はその発想はあったのですが、下3桁の切り出し方が分かっておりませんでした。
どうもありがとうございました。
また、もし一工程で済ます方法があったとしたら
後学のために教えていただけると幸いです
>>888 参考に...
このスレの範疇を超えちゃってアレだけど、
Flexible Renamerっていうリネームソフトなら正規表現+スクリプトを使って一発でできるみたい
検索:.+?(\d+)(\.[^\.]+)$
置換:"AAA"+right("00\1",3)+"\2"
(高度なリネーム、正規表現、スクリプトにチェック)
高度な置換をしたい場合はどうしてもプログラムコードが必要になるけどそれを提供してるツールもあるんだね、
891 :
860 :2011/12/07(水) 16:20:58.95
>>889 おおー!完璧です!
FlexibleRenamerはちょっと重いので敬遠していたのですが
スクリプトとの合わせ技が使えるんですね
自分には少しハードルが高いですけど
rightってことは・・・左からはleftとか使えるんだろうな〜と想像したり
"right(00\1,3)"ではないのがいまひとつ分からなかったりしますが
大変勉強になりました。ありがとうございます
元々数字が4桁以上あったら上の桁を切り捨てちゃうけどそれでいいのかな・・自分ならこれを防ぐ処理も入れるな。 それと拡張子なしのファイルには対応出来ないけどこれは考えなくても良いのかな。
スレチだけど、Flexible Renamerは便利だね。 練馬ってのもいろいろできるけど、こっちはややこしいイメージを受けると思う。
もともと4桁は想定してるようだよ。 ただ、雰囲気的に、4桁の場合は先頭が0であるという暗黙の条件があるんだろうと思ってる。 拡張子も然り。
まあ、4桁を使うようなデータが出てきたら今回のを改変して、そのまま流せばいいってのもあるとおもう
>>886 こう仮定して再帰を使った正規表現作ってくれる人ってこのスレにいるの?いない気がする。
正規表現を作ってあげたとしても質問者がコードを組めるかという問題もあるね。
>>897 「正規表現で何をしたいのかと細かい条件」
これを質問者がしっかり文章化して投下してくれないと始まらないね
>>899 それがあいまいな状態で「エンジンが鬼車なら再帰でできる」なんていうのがいるから困るんよ
嫉妬か。
斜めにもほどがあるだろ
おしい
俺も鬼車だと簡単に書けるっていうから回答楽しみにしてる
906 :
860 :2011/12/08(木) 06:52:42.57
>>892-896 みなさんありがとうございます
>>894 さんの仰る通り4桁とはいっても先頭は0です。
全部で800くらいのものを10人ばかりで分担作業したので、人それぞれでファイル名が・・・となりまして
今回のを参考に、複雑な処理はFlexibleRenamerも使ってみようと思います。
まだ消化しきれてない部分もあるので、少しずつですが勉強していきます。
どうもありがとうございました
907 :
841 :2011/12/08(木) 08:42:06.05
>>874 >>878 たとえばほげほげ+fooという文字列 ⇒項は「たとえばほげほげ」と「fooという文字列」
体重+年齢と性別*5 ⇒ 項は「体重」と「年齢と性別」と「5」
です。
>>899 正規表現でやりたいことは、
・'+','*','(',')'の4つの演算子と、C_TERMで定義された項を使った式がマッチするかどうかを判断したい。
・スレ内で議論されている、()の対応も処理したい。※(1+1))*2は当然アンマッチ
・四則演算といっていますが、項は数字ではなく、ただの文字列なので、取り出せればOKです。
・で、(?<TERM>C_TERM)を使って、マッチした項を取り出し、Match.replace()で
項を変換して置き換える。(この辺はC#の処理系の話ですが。)
また、C_TERMで使える文字使えない文字は別途チェックをします。
当然、+、*、(、)は項の文字としては使えません。
>>907 項を取り出すだけなら [^+-()]+ で十分でしょう
演算子の処理も含めるなら演算子にもマッチさせる必要があるでしょうね [^+-()]+│[\s\S]
処理をどうするかは正規表現の範疇ではありません
909 :
841 :2011/12/08(木) 11:34:25.87
>>908 例えば、
(C_TERM+C_TERM)*C_TERM+C_TERM*C_TERM
という式にマッチするかどうか?
という正規表現が知りたいのです。
この時に括弧の入れ子も精査してほしいのです。
>>909 ですから先程の正規表現でマッチできるのではないですか?
括弧の対応関係は ( の数をカウントする事で実現できます
先頭から順番にマッチして ) の数と一致するか確かめてください
正規表現そのものは決して難しくありません
>>909 漠然と式にマッチするといわれても正規表現を書きようがないのですが
括弧の対応関係は ( の数をカウントする事で実現できます
先頭から順番にマッチして ) の数と一致するか確かめてください
いずれも括弧にマッチさせた後の処理の問題です
正規表現そのものは決して難しくありません
912 :
911 :2011/12/08(木) 12:20:51.94
失礼、投稿ミスだと勘違いして連投しました >910は流してください
>>909 パターンの整合性チェック(括弧の対応がとかそういうの)をしたあとで
マッチするかどうかを調べればいいと思う
擬似コードだけど、こんなん。
pattern = "(C_TERM+C_TERM)*C_TERM+C_TERM*C_TERM";
if (isValid(pattern)) {
isMatch(pattern, str);
}
あきたならさくっと今回のに適した形にしようぜ
916 :
デフォルトの名無しさん :2011/12/08(木) 14:04:17.14
質問です。 数字と文字が混在する文字列の中から、数字だけを取り出すことは可能でしょうか? (ただし、複数個の数字文字列としてではなく、一つの文字列として取り出す場合) 例えば 「a12b3cd456efg」から「123456」を取り出す (「12」と「3」と「456」ではなく)
>>916 正規表現だけではできない。後で文字列結合すればいい。
918 :
916 :2011/12/08(木) 14:53:52.92
>>916 perlだったら
$str =~ s/[^0-9]/g;
で変換しちゃうとか。
間違ってました。
間違ってました。
>>916 perlだったら
$str =~ s/[^0-9]//g;
>>841 (?:([^+*()]+)|\((?R)\))(?:[+*](?R))?
C#は知らないけれど、こんな感じ?
ただ、((aaa+bbb)には(aaa+bbb)でマッチするけどねー。
適当に再帰下降パーザを書いた方が確実だと思われ。
925 :
922 :2011/12/08(木) 21:23:09.74
>>923 うーん、分からん。
ちょっとコード書いてみて。
簡単すぎて書くまでもない形の流れですかね。
作ろうと思ったら5分かからないと思うけど誰も作らない件
AをB、BをC・・・と アルファベットをひとつずつずらすには、どうやって書いたらいいでしょうか? サクラエディタでの置換を考えてます
>>929 Apsalyっていうマイナーなエディタなら並列置換ができるよ
>>929 linuxのsedで一発のような気がする。
シーザー暗号で有名なロジックだから、簡単に解決する方法いくつもあると思う。
934 :
851 :2011/12/09(金) 13:02:06.78
>>841 鬼車用の正規表現でよければどうぞ。この正規表現は式全体にマッチします。
(?!(?>\(+\g<項>\)+)(?!\g<演>)|(?>\g<項>)(?!\g<演>))(?<!\(|\g<演>)(?:\g<項>|\g<カ>)(?>(?:\g<演>(?:\g<項>|\g<カ>))*)
(?!\g<演>|\))(?<項>[a-z\d]+){0}(?<演>[\+\*]){0}(?<カ>\((?:\g<項>|\g<カ>)(?:\g<演>(?:\g<項>|\g<カ>))*\)){0}
長いから改行入れてます。改行を消して繋げて。
項に使える文字は[a-z\d]で指定しています、使用環境に合わせて書き換えて。
名前の意味
<項> = 1つの項
<演> = 演算子
<カ> = 開始カッコから閉じカッコまでの一対のカッコにマッチ。入れ子に対応しており、中にカッコが入っていても
開始カッコに対応する閉じカッコまでマッチします。
鬼車のオプションはONIG_SYNTAX_PERLで。大文字小文字の区別は無しで。
正規表現だけでなんとかしようと考える人はナンセンス プログラムの機能と合わせてこそ真価を発揮するぽ
なんとかしようではなく、余裕でなんとかなる範疇だよ?見た目は複雑だけどやってることは普通の正規表現と大差ない。
937 :
841 :2011/12/09(金) 15:48:15.71
>>922 項のC_TERMについてはどうすればいいでしょうか?
簡略化して再依頼です。
項には1-9の数字一桁だけとして([1-9])、
(と)と+と*のみを演算子とした式にマッチする正規表現はどう書けばいいでしょうか?
(1+1)*2 ⇒MATCH
(1+2)*(3+4) ⇒MATCH
((1+2*) ⇒UNMATCH
等
>>934 (abc+cde
これにマッチしたんだけど
>>934 あ、ONIG_SYNTAX_DEFAULTになってた。
ONIG_SYNTAX_PERLにして実行したら
ERROR: undefined group option
って出たけどどうすればいんでしょ。
できればサンプルコードを…
>>929 tr "[A-Z]" "[B-Z]A"
サクラエディタってtrコマンドを持ってるの?
視野狭窄な子が湧いてきたな
943 :
851 :2011/12/09(金) 18:02:20.87
>>938 戻り読みの判定をミスってた。いらないと思って付けなかった判定が必要だった。
修正前 (?<!\(|\g<演>)
修正後 (?<!\(|\g<演>|[a-z\d])
後で書き直したものを貼ります。
>>937 ちゃんとレス読んでるか?
C#の正規表現は再帰に対応していないから、いくら頑張っても括弧の対応はチェックできない。
さっさと諦めなさい。
>>944 標準で用意されてないだけでお手上げしちゃう人ってどうなの。
>>944 1回の正規表現でマッチさせることを諦めるだけでいいんじゃないの?
複数回マッチさせれば問題ない
目的次第なんだろうなあ
こんばんわ、近藤正彦です。
だから、何でも正規表現でやろうとすんじゃねー。
>>934 ,936
正規表現についてそのような小手先技を極めるよりも、本質的に正規表現はプログラム目的でもないしそのような言語でもないってことをまず理解した方がいい
生産性と品質を上げられるなら使うべき。 プログラム組んだ方が速くて簡単ならそっちがいい。
スレ的には正規表現の理解が深まるなら 小手先でも生産性が低くても別にいいじゃない 今回みたいに反面教師にもなるわけだし
正規表現とプログラミング(のための言語)との区別があいまいで両者一体不可分だったのはunix shellとperlの時代(1998年頃まで)で終わった。
●正規表現の使用環境 C# ●検索か置換か? 置換 ●説明 文字列の中間にある数字を検索して置き換えたい。 ●対象データ(ex.) hogehoge-123.txt → hogehoge-num.txt hogehogex-123.doc → hogehogex-num.doc
>>955 まず、「文字列の中間」を定義してください
文字列の中間というのは拡張子の直前の-の次にある数字です。 この数字があるかないかの確認はすでに済ませてあります。
>>955 検索: -\d+\(?=.[a-z\d]+$)
置換: -num
s/(.*-)\d+(\.[^.]+)$/\1num\2/
960 :
958 :2011/12/10(土) 01:20:23.66
>>958 エスケープを忘れてた
検索: -\d+\(?=\.[a-z\d]+$)
置換: -num
できました! ありがとー!
対象 ABCこの間に文字列があったりなかったりDEF 結果 DEF "ABC"よりも後続にある(最初の)"DEF"だけを対象としたいです 戻り読み条件が、長さ一定でなくてもOKならばできるのですが・・・
つ 正規表現の入門書
\Kって、なにで使える?
>>967 可変長の戻り読みが可能で(\Kより前をマッチ文字列に含めない)、置換操作で同じ文字列の置換をさせないことができる
s/(foo)bar/$1/g
s/foo\Kbar//g
どういう環境で使えるのよ
>>967 Perl 5.10以降とかpcreとかboost regexとか。
あとは
>>192 とか。サクラエディタではまだうまく動かないんだっけ?
pcreって鬼車じゃないの?
それはない。 中身のことだろ?
>>975 ところでおまえは何のために生きてるんだ?
世界の発展に貢献するため
こんばんわ、近藤正彦といいます みなさん、私の事をマッチと呼んでくさ(ry
Googleは世界の発展に貢献するために日本も含む世界各国で違法行為を行って問題になっています
彼らは世界を革命するために日夜デュエルを行っています。
こんな過疎スレでも次スレが必要だとは思わなんだ...
ハッテンさん次スレおねがい
次の次はずっと俺のターン!
>>955 とかも841の質問なのかな、遠回りな質問の仕方をするからみんなが迷惑するんだよ。
基本的な学習すらしないで人に聞いて済まそうという姿勢は頂けない。
次スレ梅
991 :
851 :2011/12/11(日) 06:42:36.51
>>841 (?!(?>\(+\g<項>\)+)(?!\g<演>)|(?>\g<項>)(?!\g<演>))(?<!\(|\g<演>)(?:\g<項>|\g<カ>)
(?>(?:\g<演>(?:\g<項>|\g<カ>))*)(?!\g<演>|\))(?<項文字>
[^\x00-\x20\-+*/=()<>]
){0}(?<項>(?<!\g<項文字>)(?>\g<項文字>
{1,30}
)(?!\g<項文字>)){0}(?<演>[\+\*]){0}(?<カ>\((?:\g<項>|\g<カ>)(?:\g<演>(?:\g<項>|\g<カ>))*\)){0}
3行目で項に使える文字を設定出来ます。↑の設定では以下の文字を使えなくしてます。
・アスキーコード表での16進数の00番から20番までの文字(改行や半角スペースなど)
・-、+、*、/、=、(、)、<、> の9文字
他に項の文字として含まれては困る文字があったら [^ ] の中に追加していって下さいね。
例、[^\x00-\x20\-+*/=()<>あいうえお] ← あいうえおの5文字が項を構成する文字から追加で除外されます。
5行目では1つの項の文字の長さを設定出来ます。上の設定では1文字以上30文字以下に設定してあります。
992 :
851 :2011/12/11(日) 07:21:44.82
>>937 >項には1-9の数字一桁だけとして([1-9])
>>991 の3行目で項に使える文字を設定します。この場合は3行目を↓に書き換えるだけです。
[1-9]
[^ ] とすると"使えない"文字の設定になります。
[ ] とすると"使える"文字の設定になります。
>項のC_TERMについてはどうすればいいでしょうか?
>>991 の正規表現は式全体にマッチする正規表現です。この正規表現で式全体を取り出し、項の部分がC_TERMに
マッチするかをテストして下さい。
今回の場合、項以外の文字は(、)、+、*の4文字だけなので、それ以外の文字列が項です。
↓の正規表現で項が1つずつ取り出せます。
[^()+*]+
取り出した文字列がC_TERMにマッチするかテストするコードを書いて下さい。すべての項がC_TERMにマッチすれば
照合完了です。C_TERMにマッチするかテストすると同時に置換もすれば目的達成です。
>>939 >ERROR: undefined group option
今回の正規表現では<項>など、グループの名前として漢字を使っていますが、C#では半角文字しか
認識出来ないのかも知れません。代わりに<TERM>などのように半角文字の名前に書き換えると動くかも知れません。
>サンプルコード
C#の環境はないので申し訳ないけど他の方にお願いしてみて下さい。^-^;
995 :
939 :2011/12/11(日) 14:59:18.55
>>992 できました。
C#じゃなくてCなんですけどね^^;;;
996 :
939 :2011/12/11(日) 15:01:04.31
うそつきました。 ONIG_SYNTAX_PERLにするとエラーが出ることには変わりなかったですorz > r = onig_new(®, pattern, pattern + strlen((char* )pattern), > ONIG_OPTION_DEFAULT, ONIG_ENCODING_UTF8, ONIG_SYNTAX_PERL, &einfo); こうじゃないってことですかね。
うめる
>>996 ONIG_SYNTAX_PERL_NGだろ?
999 :
939 :2011/12/11(日) 15:15:22.79
>>998 動きました!
>>934 で
> 鬼車のオプションはONIG_SYNTAX_PERLで。大文字小文字の区別は無しで。
と書かれていたので><
ありがとうございました
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。