10/08/13 21:18:42
Artist や Title に ' - ' が含まれたりする形式だと困るよね。
392:デフォルトの名無しさん
10/08/13 21:44:27
うん、" - " がフィールドの区切りとして使えないのなら無理じゃない?
それぐらいは保証されてると思って>>389を書いた
自分だったら " - " が文字列に2つ以上入ってたら不正な入力として受け付けないか
許される状況であれば脇によけておいて後で手作業で処理するよ
393:デフォルトの名無しさん
10/08/13 21:44:49
それは人間が見ても判別困難ですし、考慮していません。
とりあえず
(?<artist>.*) - (?<title>.*?)
にしたところ希望の動作は得られましたが、
Artist - Title
そのものがグループ(グループ名なし)として抽出されています。
これは解決できますか?
394:デフォルトの名無しさん
10/08/13 21:47:02
よくわかんないから C# のコード貼ってちょ
395:デフォルトの名無しさん
10/08/13 21:47:19
おっと、>>393は>>391宛です。
396:デフォルトの名無しさん
10/08/13 21:47:59
>>393
解決って何よ
希望の動作したならそれで十分でしょ
397:デフォルトの名無しさん
10/08/13 21:52:21
>>396
おっしゃる通りなんですけど、なんか気になるので。
>>394
一応ソースです。
//source = "山田耕筰 - 赤とんぼ"
//expression = "(?<artist>.*) - (?<title>.*?)"
Match match = expression.Match(source);
Group group;
group = match.Groups["artist"];
if (group == null)
{
artist = string.Empty;
}
else
{
artist = group.Value;
}
・・・
以下Groups["title"]、Groups["album"]について同様
398:デフォルトの名無しさん
10/08/13 22:03:03
>>397
全体へのマッチはグループ指定してないからグループ名なしのマッチでいいじゃん
399:デフォルトの名無しさん
10/08/13 22:26:13
それは仕様ですか?それともexpressionのせいでしょうか?
400:デフォルトの名無しさん
10/08/13 22:41:39
仕様。ほかの言語も似たようなもの
URLリンク(msdn.microsoft.com)
> このコレクションには、1 つ以上の System.Text.RegularExpressions.Group
> オブジェクトが格納されています。一致が成功した場合、コレクションの
> 1 つ目の要素には、一致した文字列全体に対応する文字列が含まれます。
あと>>397の正規表現だと (?<title>.*?) は空文字列にマッチしてないかな
401:デフォルトの名無しさん
10/08/13 23:03:41
>>400
なるほど、仕様なのですね。
確かに(?<title>.*?) は該当箇所が空の場合でもマッチしてます。
該当箇所が空の場合マッチさせないようにするには
(?<artist>.*) - (?<title>.*)
とすればOKでしょうか?
402:デフォルトの名無しさん
10/08/13 23:07:29
*を+にすればいいんじゃね?
403:デフォルトの名無しさん
10/08/13 23:26:07
>>402
(?<artist>.+) - (?<title>.+)
にしたらマッチしなくなりました。
動作上はこれで問題ありませんので、これにしようと思います。
今回は大変勉強になりました。
>>389-402のみなさん、ありがとうございました。
404:デフォルトの名無しさん
10/08/14 06:50:19
質問があります。
私は、HTMLでホームページを作ったのですが、
titleタグをちゃんといれて作ったのですが
h1タグを入れるのを忘れてしまっていました。
そこで、各ページのh1タグに、それぞれのtitleタグと同じものを入れたいのですが
ホームページのページ数が1000以上なので、
多過ぎて大変です。
そこで、正規表現をつかって、うまく対処する方法を教えてください。
405:デフォルトの名無しさん
10/08/14 06:59:32
stylesheet
406:デフォルトの名無しさん
10/08/14 09:06:17
>>404
<title>(.*?)</title> で title のテキストを検索
あとは <body> を検索して <body><h1>$1</h1> に置換
わけわかんなかったら親切な人がスクリプト貼ってくれるのを祈る
407:デフォルトの名無しさん
10/08/14 11:43:08
<?php
$path = "./";
$ext = ".html";
$insert_point = "<div class=\"hoge\">";
$d = dir($path);
while($f = $d->read()){
if(strpos($f,$ext) === FALSE)
continue;
$txt = file_get_contents($f);
if(preg_match('/<title>(.*)<\/title>/', $txt,$hits)){
$txt = str_replace($insert_point,"$insert_point\n<h1>$hits[1]</h1>",$txt);
if(!$fp = fopen($f,"w"))
continue;
fputs($fp,$txt);
fclose($fp);
}
}
?>
408:デフォルトの名無しさん
10/08/15 14:26:57
拙い質問で申し訳ないのですが
現在、改行コードを含めた任意の文字列を"[\s\S]*"としているのですが
ブラケット中の最初の文字がマッチした場合、それ以降は評価しないとしたら
一般的な文章では"\s"よりも"\S"にマッチする文字の方が多いことを考えて
この場合"[\S\s]*"と直した方が速度は上がると考えて良いのでしょうか?
よろしくお願いします。
409:デフォルトの名無しさん
10/08/15 15:12:35
実際に試してみた方が早いんじゃね?と言ってみる
410:408
10/08/15 15:18:56
そうですか。
他で質問してみます。どうもありがとうございました。
411:デフォルトの名無しさん
10/08/16 09:20:33
>>410
正規表現エンジンの動作を理解した方が早道