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

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

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

Re[6]: 正規表現について


(過去ログ 95 を表示中)

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

■56122 / inTopicNo.1)  正規表現について
  
□投稿者/ ポンポポン (1回)-(2010/12/28(Tue) 16:47:39)

分類:[.NET 全般] 

お世話になります。

下記の正規表現にて文字列を抽出したいのですが、入力例2の時にうまくいきません。

仕様  :[title:XXX]の文字列を抽出する。

正規表現:\[title:.+?\]

入力例1:○[title:あいうabc123]
入力例2:×[[title:あいうabc123]] ← 結果が [title:あいうabc123]] となり末尾の ]] が2つ取れてしまいます。

先頭の [ については複数個あっても1つしか抽出されないのでOKです。
末尾の ] については書いた数だけ抽出されてしまいます。

どうすれば、末尾の ] が1つしかない状態で抽出できるのでしょうか?
ご存知の方いらっしゃいましたら、ご教授お願い致します。

引用返信 編集キー/
■56124 / inTopicNo.2)  Re[1]: 正規表現について
□投稿者/ shu (332回)-(2010/12/28(Tue) 16:57:43)
No56122 (ポンポポン さん) に返信

\[title:.+?[^]]\]

これででどうですか?
'?'は不要かも?
'+' => '*'かもしれない。
引用返信 編集キー/
■56129 / inTopicNo.3)  Re[2]: 正規表現について
□投稿者/ アセセセセ (3回)-(2010/12/28(Tue) 17:31:03)
通りすがりで失礼します。
私はVB2008を使用していますが、パターン"\[title:.+?\]"で
"[title:あいうabc123]"にマッチしました。
("[title:あいうabc123]]"とはならず)

shuさんのは、\が足りないのでは?
もっと厳密にすると、"\[title:.*[^\]]\]"
ただ、前者のパターンの".+?"は改行は対象になりませんが、
後者の"[^\[]"は改行が対象になりますので注意を。
引用返信 編集キー/
■56130 / inTopicNo.4)  Re[2]: 正規表現について
□投稿者/ ポンポポン (2回)-(2010/12/28(Tue) 17:34:05)
2010/12/28(Tue) 17:47:00 編集(投稿者)
2010/12/28(Tue) 17:46:57 編集(投稿者)

shu様、アセセセセ様

早速の返信ありがとうございます。

実は[title:XXX]の後ろにもうひとつの抽出文字列があり、それがあるからではと思い、[title:XXX]だけを記述すると、\[title:.+?\] で抽出できました。

申し訳ありませんでした。

実際は複数のパターンで文字列を抽出したかったので、下記のようなパターンになっています。

Regex regex = new Regex(@"(?<title>\[title:.+?\]):(?<url>http:\/\/[a-zA-Z0-9\.\$\,\;\:\&\=\?\!\*\~\@\#_\(\)\-\%\/\+]+)");

この時、1つ目の文字列がうまく抽出できませんでした。

引用返信 編集キー/
■56131 / inTopicNo.5)  Re[3]: 正規表現について
□投稿者/ shu (334回)-(2010/12/28(Tue) 17:41:02)
No56130 (ポンポポン さん) に返信
> shu様
>
> 早速の返信ありがとうございます。
> 残念ですが、うまいきませんでした。。。
>
> [^]]\] を [^\]]\] に変えてみましたが、同様にうまくいきませんでした。
\[title:[^]]+\]
はどうですか?

引用返信 編集キー/
■56134 / inTopicNo.6)  Re[3]: 正規表現について
□投稿者/ 魔界の仮面弁士 (2004回)-(2010/12/28(Tue) 17:58:51)
No56130 (ポンポポン さん) に返信
> 早速の返信ありがとうございます。
> 残念ですが、うまいきませんでした。。。

あれ?

【JScript.NET】

import System;
import System.Text.RegularExpressions;

var s : String = "[[title:あいうabc123]]";
var r : Regex = new Regex("\\[title:.+?\\]");

//『[title:あいうabc123]』
print( s.match( /\[title:.+?\]/ ) );

//『[title:あいうabc123]』
print( r.Match( s ) );



【VB.NET】
Imports System
Imports System.Text.RegularExpressions
Module A
  Sub Main()
    Dim s As String = "[[title:あいうabc123]]"
    Dim r As New Regex("\[title:.+?\]")

    '『[title:あいうabc123]』
    MsgBox( r.Match( s ).ToString() )
    MsgBox( r.Match( s ).Value )
  End Sub
End Module


【PowerShell】

$s = "[[title:あいうabc123]]"
$r = New-Object System.Text.RegularExpressions.Regex "\[title:.+?\]"

# 『[title:あいうabc123]』
$r.Match( $s ).Value

引用返信 編集キー/
■56135 / inTopicNo.7)  Re[3]: 正規表現について
□投稿者/ ポンポポン (3回)-(2010/12/28(Tue) 18:13:06)
皆様

ご教授くださりありがとうございます。

ひとつ書き忘れておりました。
抽出元の文字列仕様は、[title:XXXXX]:http://~~となっております。
そこから、title文字列とURL文字列を抽出したいのです。
title文字列とURL文字列の区切りは何でも構わないのですが、今は「:」としています。

で、申し訳ございませんが、続きは年明けとなってしまいました。

以上、よろしくお願い致します。
引用返信 編集キー/
■56138 / inTopicNo.8)  Re[4]: 正規表現について
□投稿者/ shu (335回)-(2010/12/28(Tue) 21:40:37)
No56135 (ポンポポン さん) に返信

> ひとつ書き忘れておりました。
> 抽出元の文字列仕様は、[title:XXXXX]:http://~~となっております。
> そこから、title文字列とURL文字列を抽出したいのです。
> title文字列とURL文字列の区切りは何でも構わないのですが、今は「:」としています。

そうすると
^\[title:(?<title>.+)\]:(?<url>http:\/\/[a-zA-Z0-9.$,;:&=?!*~@#_()\-%/+]+)$
こんなではないですか?

[[title:aaaaa]]:http://〜 => failed
[title:bbbb]]:http://〜 => Title : bbbb] , url : http://
※抽出の仕様からするとこれで正しそうな気がします。

文字列を渡して開始から終了までのパターンが一致していないといけないという前提です。
複数あって区切りがあるようなら最初の'^'と最後の'$'をそれに置き換えてみて下さい。


引用返信 編集キー/
■56463 / inTopicNo.9)  Re[5]: 正規表現について
□投稿者/ ポンポポン (4回)-(2011/01/14(Fri) 14:19:49)
shuさま

お返事が大変遅くなりまして申し訳ありませんでした。
検索対象文字列内には、TITLEとURLの組み合わせが複数存在するため、下記の通りとすることで実現できました。

\[title:(?<title>.+?)\]:(?<url>http:\/\/[a-zA-Z0-9.$,;:&=?!*~@#_()\-%/+]+)

※[[title:aaaaa]]:http://〜 のようにtitleの後ろの ] が複数ある場合に、aaaaa] と抽出されてしまいますが、とりあえず解決です。

ご教授いただき、ありがとうございました!
 

解決済み
引用返信 編集キー/
■56466 / inTopicNo.10)  Re[6]: 正規表現について
□投稿者/ よねKEN (666回)-(2011/01/14(Fri) 14:56:43)
No56463 (ポンポポン さん) に返信
> \[title:(?<title>.+?)\]:(?<url>http:\/\/[a-zA-Z0-9.$,;:&=?!*~@#_()\-%/+]+)
>
> ※[[title:aaaaa]]:http://〜 のようにtitleの後ろの ] が複数ある場合に、aaaaa] と抽出されてしまいますが、とりあえず解決です。

正規表現に『]:』という部分があるので、aaaaaの直後の"]"は『]:』にマッチしないのでタイトルの一部とみなされます。

試していませんが、『[title:aaaaa]』と『:http://〜』の間に何か文字があってもよいなら、
以下のようにすればOKではないでしょうか。

\[title:(?<title>.+?)\]:(?<url>http:\/\/[a-zA-Z0-9.$,;:&=?!*~@#_()\-%/+]+)
           ↓追加箇所↓
\[title:(?<title>.+?)\](?:[^:]*):(?<url>http:\/\/[a-zA-Z0-9.$,;:&=?!*~@#_()\-%/+]+)

解決済み
引用返信 編集キー/
■56499 / inTopicNo.11)  Re[6]: 正規表現について
□投稿者/ shu (362回)-(2011/01/17(Mon) 00:43:24)
No56463 (ポンポポン さん) に返信

> ※[[title:aaaaa]]:http://〜 のようにtitleの後ろの ] が複数ある場合に、aaaaa] と抽出されてしまいますが、とりあえず解決です。
この場合、提示された抽出パターンと合わないように思うのですが抽出されてしまってよいのでしょうか?『[Title:〜』の前の『[』が前の
一致文字列の後にくる区切り文字として扱われるのなら別ですが、[Title:・・・]:http://〜の前後が具体的にどうなっているかを
正規表現に含める必要があるように思います。そうでないのなら抽出パターンを見直す必要があります。

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -