Regular Expression(正規表現) Part13©2ch.net
2 :
デフォルトの名無しさん:2014/11/05(水) 10:16:26.48 ID:wAx7C+BC
スルーされにくい質問のテンプレと例
●Regular Expressionの使用環境
Java1.5
●検索か置換か?
検索
●説明
各行の1番目のAまでを検索したい
●対象データ
ABCA
BCAA
CABA
●希望する結果
ABCA
^
BCAA
^^^
CABA
^^
※ ^ はアンダーラインだそうな ^^;
ノ ゚.ノヽ , /} ...
,,イ`" 、-' `;_' ' ..::::::::::::::...
,-、 _.._ ( (,(~ヽ'~ ..:::::::::::::::::::::::
)'~ レー' 〉 ヽ i`'} .:::::::::::::::::::::::
~つ '-ー、 i | i' ...:::::::::::::::::::::::
/ < / 。/ ! ......::::::::::::::::::::::::: これは
>>1乙じゃなくて
/ ~^´ /},-'' ,●::::::::::::::::::::::::::::::::::::
i、 ,i' _,,...,-‐-、/ i :::::::: .:::::::::::::
..ゝ <,,-==、 ,,-,/ .::::::::::: 放射能がうんたら
) {~''~>`v-''`ー゙`'~ ..::::::::: ........::.
{ レ_ノ ..::::::::. ......:::::::::
ノ '' ..::::::: ...::.:...:::::::::
.::::::::: ...:......:::::::::::: .
.:::::::::::. ..... .. ..:::::::::::::::::::::::: :::.
::::::::::::::::.::::::....:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.. :: ::..
.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::: ::.
::::::::::::::::: :::::::::::::::::::::::::::::: :::::
.:: ::. :::
7 :
デフォルトの名無しさん:2014/11/05(水) 11:16:30.19 ID:6PdTuYg9
>>6 間違えた。
× ※ サクラエディタでは複数行に渡る検索・置換は出来ません。
○ ※ サクラエディタでは複数行に渡る検索は出来ません。
置換欄に \r\n を入れれば行を増やすことは出来るようだ。
>>10 補足
alt=""の置換は出来ればいいや程度で本命はURL文字列ないの置換です。
0埋めが無理な場合は1桁、2桁、3桁の場合で複数回に分けても構いません。
…?
<!-- 1-24 -->
からURLをどうやって導出するんだ?
URLの末尾のみが変動すると仮定するなら、安直なのは
var base = '<p><a href="
https://picasaweb.google.com/(略)"><img src="
https://lh3.googleusercontent.com/(略)_[HAGE].JPG" height="640" width="480" alt="$1" /></a></p>';
console.info("<p><!-- 1-1 --></p>".replace(/<p><!-- (\w+-(\d{1})) --><\/p>/, base.replace('[HAGE]', '00$2')));
console.info("<p><!-- 1-22 --></p>".replace(/<p><!-- (\w+-(\d{2})) --><\/p>/, base.replace('[HAGE]', '0$2')));
console.info("<p><!-- 1-333 --></p>".replace(/<p><!-- (\w+-(\d{3})) --><\/p>/, base.replace('[HAGE]', '$2')));
禿丸は持ってないのでJSなのは許せ
前スレでこの手法で置換してた人がいたね。
1-24
↓
1-0000024
↓
1-\d*(\d{3})(?!\d)
↓
1-$1
>>10 MKEditorだと正規表現はかなり貧弱な模様なので、マクロかスクリプトでやるべきだよ
例として WSH(JScript)の場合(c:\test.js)
MKEditorのメニュー - ツール - コマンドに、
コマンドライン: c:\test.js
パラメータ: %FILENAME%
として登録し実行
ただし、ファイルが外部で書き替わってもMKEditorは認識してくれないので
既存のファイルのみ可能でコマンド実行後、メニュー - ファイル -読み直すことが必要
var base = '<p><a href="
https://picasaweb.google.com/lh/photo/CywfGi9h5Rglb16GAkhh8GIVtM1tvezqxIpxXhd2SqU?feat=embedwebsite">'
+'<img src="
https://lh3.googleusercontent.com/-ykcoD1uynzU/VFg3lb6lAHI/AAAAAAAAJ4c/80boYt68n0w/s640/201410%25E9%259B%25B2%25E5%258F%2596%25E5%25B1%25B11_';
var opt1 = '\.JPG" height="640" width="480" ALT="';
var opt2 = '" /></a></p>';
var re=/<p><!--\s+(\d-(\d{1,3}))\s+--><\/p>/g;
try {repComment(WScript.arguments);} catch(e){WScript.Echo(e.number+" :"+e.message);}
function repComment(arg) {
var n=0,rfile,wfile;
var fs = new ActiveXObject("Scripting.FileSystemObject");
if(arg.length<1) throw new Error(10001,'パラメタ1にファイルパスを指定してください');
if(!fs.FileExists(arg(0))) throw new Error(10002,'指定ファイルがありません('+arg(0)+')');
rfile=fs.OpenTextFile(arg(0),1,true,0);
data=rfile.ReadAll();
data=data.replace(re,function($0,$1,$2){n++;return(base+('00'+$2).slice(-3)+opt1+$1+opt2)});
rfile.Close();
wfile=fs.OpenTextFile(arg(0),2,true,0);
wfile.Write(data);
wfile.Close();
fs = null;
WScript.Echo(n+'個の置換終了');
}
皆様ありがとうございます。
>>10 です。
PicasaのURLをその後しばらく眺めていたところ、末尾以外にも変動するところが複数あり、しかも規則性なし、みたいで凄まじく脱力しております。おのれ、Googleめ。
せっかく多数の解決案をお示し頂きましたのに、私の調査不足でこんなことになりすみませんでした。
が、他に、正規表現で対処出来そうな物があるので、頂いた案を参考に自力で出来るように頑張ります。
MKEditorが複雑な置換に向かないということもご指摘ありがとうございます。
まことに申し訳ありませんでした。
>>9 WSH/JScriptのマクロなどで全文を取得→JScriptのRegExpとreplaceで処理→本文に反映、という手段は一応ある。
こういうのは何処らへんまでテンプレで説明するべきなんだろうなぁ…
質問(問題解決法の問い合わせ)に対する回答としては十分有効なんだが、テンプレ化すべきかと言われると悩む。
>>14みたいなテクもね。こういうノウハウをどこかに蓄積しといて
回答するときに「ココ見て」で済むようになると理想的だね。
●Regular Expressionの使用環境
秀丸Editor
●検索か置換か?
置換
●説明
HTMLファイルの<div>の中にある<br />を半角スペースに置換したい
●対象データ
<html><body>hoge<br />hoge<br />
<div>AAA<br />BBB<br />CCC</div><br />
hoge<br />hoge<br />
<div>DDD<br />EEE<br />FFF</div>
</body></html>
●希望する結果
<html><body>hoge<br />hoge<br />
<div>AAA BBB CCC</div><br />
hoge<br />hoge<br />
<div>DDD EEE FFF</div>
</body></html>
秀丸の仕様を調べようとしたらマニュアルが有料だった。
\Gが使えれば一行で書けるけど果たして・・
bbq
☆
[a-z.]*[☆骨][a-z.]*
☆や骨だけでもNGになってしまうが
少々の誤爆ぐらいなんでもないだろ
「☆取って」とか「☆ヌキ」とかに注目した方がバリエーション少ないかもしれんな
>>27 ちょっと誤爆が怖いです
>>28 ありがとうございます。*を+にして様子見ます
でもそれって暫くしたら削除されてるよね?
32 :
デフォルトの名無しさん:2014/11/11(火) 22:33:19.94 ID:le80kSgY
先に☆消してしまえばいくね?
性器表現てちんぽまんこだね
あ、置換欄は半角スペ1個ね。
>>35 \nがみにくい
(?#maxlines:10)でいいだろ
>>38 ぶw そんなのがあったのね、指摘ありがとう。
コメントに\nを並べるというアイデアは既にあるだろうとは思ってたけど
作者がこういう形で対応していたとは・・。
>>35 横からすみませんがPHPでどう書くか教えていただけませんか?
>>40 秀丸特有の問題なのにPHPでの解決法を聞かれてもなぁ…
行跨ぎできないのだとしても、プログラミング言語なら改行消して処理しろで終わりだし。
そうでなく、1行の正規表現で置換するやり方を知りたいんじゃないかな。
\G ・・・ 文頭、または前回マッチした文字列の直後の位置にマッチする
前回マッチした文字列のみにマッチさせたい場合、\G(?!\A) と書く。
\K ・・・ これより前にある正規表現にマッチした文字列をマッチ文字列に含めない
\A ・・・ 文頭のみにマッチする。行頭にはマッチしない。
\X ・・・ 改行文字を含む任意の1文字にマッチする。
(?# ) ・・・ (?# この部分はコメントとして無視されます )
\X 以外はPHPでも同じじゃないかな? \X を (?:.|[\r\n]) に書き換えるだけで動くはず。(たぶん)
最後のコメントは秀丸用のおまじないなのでPHPにはいりません。(~-~)b
>>42 おお
ちゃんと動きました!
感謝です
似たような事で詰まってたので非常に助かりました
なるほど
d
(~-~)b
任意の1文字にマッチは普通[\s\S]って書かないか?
説明めんどうだからああ書いたけどPHPならオプションでピリオドの動作を替えられる。
>>35の正規表現も分かりやすいようにカッコをまとめたりしないように書いた。
やろうと思えばもっと処理の軽い書き方も出来る。
あいうabcえお
\<abc\>
がマッチしないのはなぜですか?
51 :
デフォルトの名無しさん:2014/12/10(水) 00:25:21.40 ID:aGgAMtGi
うわあ
\を使ったエスケープ文字は、特定のものしか使えない
\<,\> こういうエスケープ文字があるかね?
無ければエスケープされずに、<,> と解釈されるだけ
つまり、\<abc\> → <abc>
www
わろた
>>50 [あーお]も単語構成文字と見做す処理系だとマッチしないな。
>>50 [あーお]も単語構成文字と見做す処理系だとマッチしないな。
57 :
デフォルトの名無しさん:2014/12/10(水) 18:29:36.14 ID:aGgAMtGi
>>50 [あーお]も単語構成文字と見做す処理系だとマッチしないな。
ああおさんウザいっす
59 :
デフォルトの名無しさん:2014/12/14(日) 23:54:23.95 ID:tpBHSSwh
_Abc
_Xyz
にはマッチするけど
_ABCにはマッチしない正規表現おしえて
(_Abc|_Xyz)
じゃダメかしらん?
>>59 lookaheadが使用可能なら「_(?!ABC).+」
でも_ABCDもマッチさせるとかであればわからない
●Regular Expressionの使用環境
Ruby
●検索か置換か?
検索
●説明
(ひらがな、カタカナ、漢字、英数字(全角/半角)、","(全角/半角)、"."(全角/半角))のみの文字列を抽出したい
●対象データ
1不思議な2新聞3
.に書,いて.ある,
+通り-に行/動し*た結果
憧れ(の)同級生と…
●希望する結果
1不思議な2新聞3
.に書,いて.ある,
よろしくお願いします。
/\A[ここにマッチさせたいものを全部書く]+\z/
>>63 ありがとうございます。
うまくできました。
●Regular Expressionの使用環境
Ruby
●検索か置換か?
検索
●説明
後ろ向きの最短一致をさせたい
●対象データ
<a>あいう<b>123</b>えお</a><a>かきく<b>456</b>けこ</a>
●希望する結果
456で検索して
<a>かきく<b>456</b>けこ</a>
よろしくお願いします。
>>6の一番下のタグの中に「ある文字列」を含まない正規表現
67 :
【ニダー】 :2015/01/03(土) 06:50:23.28 ID:OaaIU2j6
!omikuji
●Regular Expressionの使用環境
サクラエディタ
●検索か置換か?
置換
●説明
謹賀新年hogehoge>
↓
謹賀新年>
ランダムな文字列であるhogehogeを一括で消す
突っ込みどころあると思いますがどうかよろしくお願いします。
●対象データ
謹賀新年hogehoge>
ランダムな文字列:hogehoge
●希望する結果
謹賀新年>
ランダムな文字列というからにはhogehogeはいろいろ変化するんだよね
謹賀新年と>は固定でいいの?
ハイ!
だったら難しいことは何もないような・・・
置換前:(謹賀新年).*?(>)
置換後:$1$2
ありがとうございます
テスト
分かりやすく言えば
1、 「スペース2つ」 を区切りとして、前、後 の2つに分断する。
2、 その 前 のみを取り出す
という処理。
これによってスペース2つが出現するまでの文字列が出力される。
>>75 ありがとうございます
@番目の
「スペース2つ」→\s\s
「分ける」がどれに当たるのでしょうか?
ググってもsplitのページがヒットしてしまいます
A番目の
「前のみ」はどれに当たるのでしょうか?
「正規表現」でググると
JavaやPHPなど高度なプログラミングみたいのがヒットしてしまうのですが
「正規表現」にも多種あるようですが
自分のやろうとしている「正規表現」はなんて検索すればいいのでしょう?
宜しくお願いします
>> 74
> Taskerのスレで下記の様な正規表現でアドバイス戴けたのですが
> その意味が解らないので解説頂けないでしょうか?
> (.*?)\s\s.*
> 自分なりに調べたのですが理解できませんでした
> (.*?)→0文字に一致?それとも0文字を$1に格納?
> \s\s.*→2つのスペースに0文字以上の文字?
例えば、正規表現が `.\s' なら、何か1文字とそれに続く空白文字1文字にマッチする
これを
>>75 が言った言い方だと、空白文字1文字と、その前の何か1文字にマッチする
前のみっていうのは、文字の位置的に `\s\s' の前に `(.*?)' が有るから
少しくどくなるが、`(.*?)\s\s.*' の場合、検索を始めた箇所(最初は先頭)から、
`.': 改行以外の任意のある文字、一文字に一致する
`*?': その一致するものは無くてもいいけど、何か文字が有ればずーっと文末まで一致する
...では無くて、`\s\s'の手前までの全てに一致する
`?' 無しの `.*' だと、一致したもののうち一番長いものを採用し、途中の`\s\s'は`.*' に含まれてしまうが、
`?' が付いていると、最初に見つかった`\s\s'を採用して、その手前までになる
`\s\s': で、空白文字の2文字に一致し、以下略
ココら辺で、遊んでみれば。(さくらが咲いてますよって出るので、comにしてある)
scriptular.com
rubular.com
regexr.com
公式Userguideはここっぽいね。使える正規表現も書いてあった
http://tasker.dinglisch.net/userguide_summary.html#matching.html #Pattern Matching ##Regular Expression Matching ###Matching Rules
>>77 詳しい解説とtxtファイルの引用まで本当にありがとうございます!
`\s'などの個々の意味までは調べて理解できたのですが
その組合わせとなると本当に難しいです
解説頂いた`(.*?)'部分をコピペ保存し整理しながら読みといてみたいと思います
本当にありがとうございました
当初↓のサイトとにらめっこし理解に苦しんでいたのですが
http://msdn.microsoft.com/ja-jp/library/cc392020.aspx 具体的な詳しい解説をして下さっ
たので理解できました!
今回の↓を正規表現にすると
[メールアドレス](スペース)[件名]
.*?\s.*と表現でき
.*→全ての文字列に一致してしまうが?を付加で最少の文字列を採用させる
それは\sまで
また()で一致した[メールアドレス]部分を記憶させる
という具合なんですね
今回の様に[メールアドレス]部分のみを記憶したいのであれば
(.*?)\sだけで
.*は要らないのでしょうか?
また()で記憶した[メールアドレス]を呼び出したい場合は
$0指定で合ってますでしょうか?
> 今回の様に[メールアドレス]部分のみを記憶したいのであれば
> (.*?)\sだけで.*は要らないのでしょうか?
実際のデータが[メールアドレス](スペース)[件名]では
`(.*?)\s\s.*' では `\s\s' の部分がマッチしないと思うんだけど、
実際のデータが[メールアドレス](スペース)[件名]で合っているなら、要らないんじゃないか
私なら、先頭に `^' も付けて、また確実にスペース1つならば、\sより、` 'にして
結果、`^(.*?) ' とか、`^([^ ]*) ' にする。しかし、試せないので...実際に試してみて
> また()で記憶した[メールアドレス]を呼び出したい場合は$0指定で合ってますでしょうか?
一般的に $0 はマッチした文字列全体を、$1 は最初のカッコでマッチした文字を参照するので
`(.*?)\s' や `^([^ ]*) ' ならば、$1でしょう。$0ならスペースも含まれる
`$1'に置換する所を、`===>$0<===' に置換するようにして表示してみれば違いが分かるかも
ところで、こんな記述を見つけた。K9メールは関係ないかもしれないけど、一応貼っときます
http://pralin.info/tasker/tasker_userguide/user_guide/variables.html > Built-In Variables (組込み変数)
> 略
> Email From / Cc / Subject / Date / Time (‘K9メール’で受信したEメールに関する情報)
> (dynamic)
> %EFROM / %ECC / %ESUBJ / %EDATE / %ETIME
> K9アプリケーションで前回受信したEメールの、送信者、Cc、件名、受信日、時間です。
訂正
私なら、略
結果、`^(.*?) ' とか、`^([^ ]*) ' に、もしくは、`^[^ ]*' にして、置換を `$0' にする
重い
不安定
不安定
本文が長すぎます
>>80-81 低レベルな自分に
何度も丁寧に本当にありがとうございます
コピペ保存し後でじっくり読み解いてみたいと思います!
Androidメーラーである[K-9]を利用すれば手っ取り早いみたいなんですが
ActiveSyncプロトコルに対応していないので
Android標準メーラーで[From]を変数に格納し鳴り分けに取り組んでいます
その課程での正規表現でした
その難しさに圧倒されていますが
皆さんの教えで何とか理解し組んで動いた時の感動はひとしおです
>>80-81 お世話になってます
追加で提案して頂いた正規表現
■`^([^ ]*) '→[スペース]ではない文字を0回以上[スペース]まで繰返し検索で()によるって$1に記憶
■`^[^ ]*'→[スペース]ではない文字を0回以上繰返し検索でその(全ての)結果が$0に記憶される←[スペース]入っていないのでそのまま使える
で合ってますかね?
追加の提案で理解が深められた気がします!
早速Taskerにて検証してみました
【表現】`(.*?)/s'
【結果】
[email protected][件名]
【表現】`^([^ ]*) '
【結果】
[email protected] [件名]
【表現】`^[^ ]*'
【結果】
[email protected] [件名]
でした
これはTaskerの仕様で
全文を正規表現で表し
記憶させたい部分を()で指定しなければ駄目なので
敢えてT'[.*?]/s.*`と教え頂けたと学ぶことができました
本当に勉強になりました
ありがとうございました
(`・ω・´)ゞ多謝
検索と置換を間違えて嘘を教えた orz だけど、理解が進んだ様で良かった
> これはTaskerの仕様で
Taskerだけでなく、置換では、マッチしなかったものはそのまま残る。ごめん
例えば、Java
public class Sample{
public static void main(String []args){
String str = "ABC_ezwebNeJp KENMEI";
str = str.replaceFirst( "^(.*?) ", "==>$1<==" );
System.out.println( str );
// it prints "==>ABC_ezwebNeJp<==KENMEI"
}
}
sed では
$ echo 'ABC_ezwebNeJp KENMEI' | sed -e 's/^\([^ ]*\) /==>\1<==/'
==>ABC_ezwebNeJp<==KENMEI
書き込めなかったので ABC_ezwebNeJp にしてる
>>88 補足までありがとうございます
> 置換では、マッチしなかったものはそのまま残る。
テキストエディタなどでの置換をイメージすると
確かにおっしゃる通りの振る舞いですね
すっきりすることができました
最後まで本当にありがとうございました
>>90 \s\s の話は不思議に思って
>>80 で、念を押してたんだけど、
まあこれも勉強でしょ
それよりも、ある程度完成したみたいで良かったね
>>91 先程完璧に完成することができました!
こちらのスレでのご教授のお陰でもあります
普段何気に利用しているソフトウェア
それを組み上げて作ってるプログラマの偉大さを今回痛感させられました
本当にありがとうございました
連続するメタ文字"+()+"を正規表現でマッチさせたいとき
"\+\(\)\+"とやってますけど、範囲を指定してエスケープするにはどうすれば良いですか?
某サイトにあった"\Q+()+\E" では動きませんでした。エクセルVBAです。
\+\(\)\+
すいません、「範囲を指定して」を見落としてたんで上のは取り消しで・・。
それを見落としたとして何故その回答になる
無意識に適当に読んでたらしく
>連続するメタ文字"+()+"を正規表現でマッチさせたいときエスケープするにはどうすれば良いですか?
>某サイトにあった"\Q+()+\E" では動きませんでした。
という質問だと思って答えてしまった。環境くらい書いてよとか思ったけどしっかりVBAって書いてあったw
#include <iostream>
#include <regex>
#include <string>
#include <locale>
using namespace std;
void main()
{
wcout.imbue(locale("japanese"));
const wchar_t* input = L"Dim str As String = \"テスト。文字列の中に'がある\" 'コメント";
wcout << L"input ->" << input << L"<-" << endl;
const wchar_t* pattern = L"\'.*$";
const wchar_t* replacement = L"";
wregex re(pattern);
wstring result = regex_replace(input, re, replacement);
wcout << L"result->" << result << L"<-" << endl;
}
VB.NETのソースからコメントを全部取り除くプログラムをVC++2013のwregexで
作ってみたのですが、文字列の中にあるシングルクオーテーションにもマッチ
してしまいます。これを回避して、本来のコメントのみにマッチする表現を
教えて下さい。
ああ、それとコメントには ' 以外に REM で始まる行もコメントの
ようなので、それにも対応したようなのが出来れば最高です。
よろしくお願いsいます。
s
REM
仕事を人に丸投げすんなよ。。。
つーかコメントは入れ子があるから無理
VBはブロックコメント無いのか
じゃあ
^\s*([Rr][Ee][Mm]|').*$
でいいんじゃね
105 :
デフォルトの名無しさん:2015/01/23(金) 22:35:00.86 ID:Hr76SqrY
>>99 そんなレベルで満足せずに
VBコンパイラ作れ
>>99 考え方だけ。クォートのものを優先してマッチさせる regexp を使う
クォートでマッチしたものは、置換しない
あまり考えないで書いたコードなので、適当に修正して下さい
const wchar_t* pattern = L"(\"[^"]*\")|('[^']*')|('.*$|REM.*$)";
const wchar_t* replacement = L"$1$2";
>>106 教えていただいたパターンでいい感じでマッチしました。
大変ありがとうございます。
正規表現の初心者なので、教えていただいたパターンの意味が
今一つよく理解できていません。| ってOR の意味ですよね?
これでなんで期待通りの動きをするのか分らない。。。ああ難しい。
108 :
デフォルトの名無しさん:2015/01/25(日) 02:57:07.01 ID:n/w7cTTn
ひんと
$1→(\"[^"]*\")
$2→('[^']*')
$3→('.*$|REM.*$)
$1→(\"[^"]*\")
$2→('[^']*')
$3→('.*$|REM.*$)
$1は、"", "a", "abc"
$2は、'', 'a', 'abc'
$3は、', 'a, 'abc,
REM, REMa, REMabc,
ややこしい
そんな事ないよ
正規表現むずかしい
正規表現はずかしい
Regular Expression
115 :
106:2015/01/25(日) 12:31:28.78 ID:nzAr/S0d
>>108>>109 >>115 詳しい解説ありがとうございます。その後、必死で正規表現を勉強している
のですが、なかなか進みません。
その過程で、VisualStudio2013では 肯定先読みとか肯定後読みとかが
使えないようなのですが
そういうのを使いたい場合には、Boostを使うしかないですか?
正規表現は遊びながら覚えると面白いよ。難しく考えないほうがいい。
boostはperl並に強力な正規表現エンジンだからこれが使えるなら是非使おう。
> boostはperl並に強力な正規表現エンジン
正規表現はテキストファイルの中にある次の二つの行を見付けて
//---ここから
//---ここまで削除
この範囲にある行(この二行も含む)を全部削除するような処理に使えますか?
c++のregexです。
「---ここから」とか「---ここまで削除」が付いてるなら可能じゃね?
ネストしてたら知らんけど
>>120 レスありがとうございます。ネストは無しです。
その程度なら正規表現使わないでも書けるだろうしその方が速くないか
>>119 質問に回答致します。
> 使えますか?
はい。
では次の方どうぞ。
125 :
デフォルトの名無しさん:2015/02/19(木) 16:10:49.61 ID:a/uQUW78
rubyで下記の文字列から頭が■の部分だけを抜き出したいのですが、うまくできません。
"□あああ■いうえお□かきくけ■さしすせ□たちつて□となにぬ□ねの■はひふ□へほ"
理想の結果["■いうえお","■さしすせ","■はひふ"]
126 :
デフォルトの名無しさん:2015/02/19(木) 18:27:15.60 ID:W1BgVy30
>>125 ■から□の直前までを抜き出す正規表現です
+ とか u は適当に修正
"□あああ■いうえお□かきくけ■さしすせ□たちつて□となにぬ□ねの■はひふ□へほ".
scan( /■[^□]+/u )
127 :
デフォルトの名無しさん:2015/02/20(金) 09:05:16.00 ID:eLhLRYkP
>>126 ありがとうございます。あっさりできました。
色々とごちゃごちゃ試しましたがこんなに単純にできるんですね。
128 :
デフォルトの名無しさん:2015/02/23(月) 16:22:27.12 ID:Ux68NKC8
>>125と似た感じなのですが、
rubyで下記文字列から円の前の金額部分を抜き出したいです。宜しくお願いします。
"123百万円(250ほげ)、285百万円(ほげ125)
1億2千3百万円
1,230万円(ほげ2000.12ほげ)
1,230,000円(2000.12ほげ)"
129 :
デフォルトの名無しさん:2015/02/23(月) 16:30:14.61 ID:Ux68NKC8
自己レス
>>128です。
できた気がしますが、こんなんで良いんでしょうか?
str.scan(/\d[^()]+?[億千百万]?円/)
>>128 [億千百万]? の部分は、提示したデータだと、抜いても結果が変わらない
何かの考えがあって入れているのだと思うけど、その意図が今一つ不明
実際のデータが、示されたものと違うのかな?
> こんなんで良いんでしょうか?
上記の問題を検討した上でだが、実際のデータから希望の結果が出るなら
それで良いんじゃあないかと思います
あえてここで、何か答えるとすると
もしも、(...)で囲まれたほげ数字にも、円で終わるものが有ったりしてややこしくなるなら、
一度に処理しようとせずに、予め元のデータから(...)だけを削除しておくのも良い手だと思う
# `.*?' の代わりに `[^))]*' でも同じ。良く分からないから半角()も入れておいた
# 「円の前の金額部分」という事なので、円の手前までを抜き出したもの
# ちなみに、この scan() だけでも、今回の解答になっています
str.gsub( /[((].*?[))]/, '' ).scan( /[\d,億万千百]+?(?=円)/ )
q=(.*)$
136 :
135:2015/02/24(火) 23:14:28.24 ID:22oMyd1b
138 :
135:2015/02/25(水) 01:05:33.84 ID:hHD/IuY8
>>137 設定が元に戻るの気づきませんでした
代わりのアドオンまで教えてもらってありがとうございます!
さっそく使ってみたいと思います
どうもありがとうございました
139 :
デフォルトの名無しさん:2015/02/25(水) 09:39:58.62 ID:q6hZn1+T
>>130 >str.gsub( /[((].*?[))]/, '' ).scan( /[\d,億万千百]+?(?=円)/ )
よくわからない質問に回答いただきありがとうございます。
書いて頂いた式についてなんですが、(?=円)の表現は初めて見たのですがどんな意味なのでしょう?
PHPでやってます。
mb_eregi("a(?!b|c)","ad"));
や
mb_eregi("a((?!b))","ad"));
の否定先読みがマッチするのは予期通りなのですが、
mb_eregi("a((?!b|?!c))","ad"));
がマッチしない理由がわかりません。どうしてでしょうか?
142 :
141:2015/03/01(日) 15:52:19.09 ID:+/3fb9m1
(末尾の「)」が多かったので訂正します)
PHPでやってます。
mb_eregi("a(?!b|c)", "ad");
や
mb_eregi("a((?!b))", "ad");
の否定先読みがマッチするのは予期通りなのですが、
mb_eregi("a((?!b|?!c))", "ad");
がマッチしない理由がわかりません。どうしてでしょうか?
ただの文法エラーじゃないの?
(?!)はグループの先頭にしか置けないと思うが
145 :
141:2015/03/01(日) 20:20:08.60 ID:+/3fb9m1
>>144 おおまさに。正規表現自体が無効だったらしく、
PHPのエラーログがありました。
PHP Warning: mb_eregi(): mbregex compile err: target of repeat operator is not specified
JavaScriptです。
どうしても、できないので申し訳ないのですが、お尋ねします。
[キノコ] ⇒ たけのこ
という具合に[ ]をはずした上で、さらに文字列を置換したいです。
どのような正規表現を書けば良いのでせうか?
147 :
デフォルトの名無しさん:2015/03/06(金) 16:42:47.64 ID:MdPyuokm
単に[]をエスケープしてないだけでは?
/\[キノコ\]/
/\[.*?\]/
>>147 やってみましたが、駄目でした。
[キノコ]⇒[たけのこたけのこたけのこ]
となってしまいました。
str.replace("/\[キノコ\]/","たけのこ")としてるのですが、どうも、自分の
今作りこんでるものでは、RE2構文でなければならないということのようです。
プレーンなJavascriptでは普通に置換ができました。ありがとうございます。
残念ですが、何か他の手段を考えてみます。
>>149 どもです。
試してみました。そのままだと上手く行かなかったのですが、参考にして以下の
ようにしたら、うまくいきました。
str.replace("(\\[)(キノコ)(\\])","たけのこ");
/ではなく、()で前後の[]をエスケープするしょりを括るみたいでした。
見事置換が出来ました。大変感謝です。ありがとうございます。
それもしかしたらカッコいらないかもね。とりあえず出来て良かった、おつおつ。
正規表現の方は "" で括ってしまうより
str.replace(/\[キノコ\]/g, "たけのこ")
みたいな方が。
g や m や i などフラグも簡単だし。
"" で括らないと何かマズい?
>>152 > 今作りこんでるものでは、RE2構文でなければならないということのようです。
だそうなので、String.prototype.replaceが置き換えられてるんじゃね
なるほど、スレ汚しスマヌ