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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.85005 の関連記事表示

<< 0 | 1 >>
■85016  Re[3]: 正規表現の考え方がわかりません
□投稿者/ Hongliang -(2017/09/05(Tue) 14:13:03)
    突き詰めると面倒なので、入力がRectangleF::ToString()であるという前提であれば、
    {X=(?<x>.+),Y=(?<y>.+),以下略}
    のように割り切ってしまうのも手かと思います。
記事No.85005 のレス /過去ログ145より / 関連記事表示
削除チェック/

■85017  Re[4]: 正規表現の考え方がわかりません
□投稿者/ 夜叉丸 -(2017/09/05(Tue) 14:28:52)
    No85016 (Hongliang さん) に返信
    > 突き詰めると面倒なので、入力がRectangleF::ToString()であるという前提であれば、
    > {X=(?<x>.+),Y=(?<y>.+),以下略}
    > のように割り切ってしまうのも手かと思います。


    "[-]*\w+.*\w?"でやってみたらいけました。
    これですべて賄えるのかわかりませんが・・・


    それと[.+]だけでなぜいけるのか全く分かりません。
    これでいけるのなら
    Match m1 = new Regex(@"{X=(?<X>+),Y=(?<Y>+),Width=(?<Width>+),Height=(?<Height>+)}").Match(ra.ToString());
    これもいけそうな気がするのですが・・・いけませんでした。

記事No.85005 のレス /過去ログ145より / 関連記事表示
削除チェック/

■85019  Re[5]: 正規表現の考え方がわかりません
□投稿者/ ペイビン -(2017/09/05(Tue) 14:37:36)
    (?<Y>+) の括弧の中は
    単に、1個の+文字にマッチする、という意味ですよ。
記事No.85005 のレス /過去ログ145より / 関連記事表示
削除チェック/

■85020  Re[6]: 正規表現の考え方がわかりません
□投稿者/ 夜叉丸 -(2017/09/05(Tue) 14:49:32)
    No85019 (ペイビン さん) に返信
    > (?<Y>+) の括弧の中は
    > 単に、1個の+文字にマッチする、という意味ですよ。
    > 
    ますます、わからなくなってきました。[+] が [.+] になると [.+]かどうかの判断にならずに、フロート型数値文字列をとれるようになるのでしょうか?
    
    また Rectangle ra = new Rectangle(1, 12, 234, 4); としてマイナスがない状態なのに
    Match m = new Regex(@"{X=(?<X>[-]*\w+,Y=(?<Y>[-]*\w+,Width=(?<Width>[-]*\w+),Height=(?<Height>[-]*\w+)}").Match(ra.ToString());
    これがいけて次のがいけなくなる理由もわかりません
    Match m1 = new Regex(@"{X=(?<X>*\w+),Y=(?<Y>*\w+),Width=(?<Width>*\w+),Height=(?<Height>*\w+)}").Match(ra.ToString());
    
    [-]はマイナスフラグを取得するためのものではないのでしょうか?
    と、同時に[\w+]は文字をとってくるための手段ではないってことですか?
    
    \w で1文字とってきて、\w+ は連続した文字をとってくるという認識が崩れてしまいました。
    例えば "ABC" の3文字をとる場合、 ~\w\w\w" でも "\w+" でも取得できると思っていたのですが・・・
    
    
    
記事No.85005 のレス /過去ログ145より / 関連記事表示
削除チェック/

■85022  Re[7]: 正規表現の考え方がわかりません
□投稿者/ shu -(2017/09/05(Tue) 15:10:29)
    No85020 (夜叉丸 さん) に返信
    
    VB.NETソースですが
    RectangleF.ToString()の結果であれば
    
    
            Dim rf As New RectangleF(CSng(TextBox1.Text), CSng(TextBox2.Text), CSng(TextBox3.Text), CSng(TextBox4.Text))
            Dim re As New Regex("(?<Column>\w+)=(?<Val>[^,}]+)[,}]")   <--- 最後は *?)[,}]でも大丈夫かも。
            For Each m In re.Matches(rf.ToString).OfType(Of Match)
                Console.WriteLine($"{m.Groups("Column")} = {m.Groups("Val")}")
            Next
    
    こんな感じでどうでしょう?
記事No.85005 のレス /過去ログ145より / 関連記事表示
削除チェック/

■85023  Re[7]: 正規表現の考え方がわかりません
□投稿者/ Hongliang -(2017/09/05(Tue) 15:43:55)
    正規表現においては、[ ] は特別な文字です。なので、文中に紛れると正規表現的な意味の [ ] なのか単に文字列を強調するためのものなのか区別がつかなくなります。
    ここでは二重引用符 "" で文字列を強調することにします。"." であれば、正規表現中に . と記述することを意味します。

    > [+] が [.+] になると [.+]かどうかの判断にならずに、フロート型数値文字列をとれるようになるのでしょうか?

    "+" は、「直前の文字が1回以上出現する」にマッチします。
    が、"(?<a>+)" と記述した場合、 "(?<a>" の部分は文字ではなくグループ化およびグループ名のためのものであり、文字ではありません。
    なので、「直前の文字」が存在せず正規表現の解析時に実行時例外になるでしょう。

    "." は、「任意の1文字」にマッチします。
    ".+" とすると、「「任意の1文字」が1回以上出現する」にマッチすることになります。

    なお、"[+]" は、まず "[ ]" によって、「その中のいずれかの文字」にマッチすることになります。
    "[ ]" の内部では "+" のような普段の正規表現中では特殊な文字も、普通の文字として扱われます。
    なので、"[+]" は、「"+" のいずれかの文字」、つまり "+" にマッチすることになります。

    > また Rectangle ra = new Rectangle(1, 12, 234, 4); としてマイナスがない状態なのに
    > Match m = new Regex(@"{X=(?<X>[-]*\w+,Y=(?<Y>[-]*\w+,Width=(?<Width>[-]*\w+),Height=(?<Height>[-]*\w+)}").Match(ra.ToString());
    > これがいけて次のがいけなくなる理由もわかりません
    > Match m1 = new Regex(@"{X=(?<X>*\w+),Y=(?<Y>*\w+),Width=(?<Width>*\w+),Height=(?<Height>*\w+)}").Match(ra.ToString());

    "*" は「直前の文字が0回以上出現する」にマッチします。
    しかし "+" のときと同じく、"(?<X>" が文字ではないので、その直後に "*" を置くことはできません。

    > [-]はマイナスフラグを取得するためのものではないのでしょうか?

    最初の正規表現ではマイナス符号を取得するためのものですね。
    "[ ]" で囲む意味はないし、* だと2つ以上連続していても許されてしまう問題がありますが。

    > と、同時に[\w+]は文字をとってくるための手段ではないってことですか?

    "\w+" は、アルファベット・数字・アンダースコアのみで作られている部分文字列にマッチさせるものです。
    正規表現では "[a-zA-Z_0-9]+" と等価ですね。

    > \w で1文字とってきて、\w+ は連続した文字をとってくるという認識が崩れてしまいました。
    > 例えば "ABC" の3文字をとる場合、 ~\w\w\w" でも "\w+" でも取得できると思っていたのですが・・・

    先の投稿で「いけませんでした」とだけ書かれていますが、単にマッチしなかったのと、正規表現の解析失敗による実行時例外をごっちゃにしていませんか?
    例えば
    new Regex(@"{X=(?<X>*\w+)")
    は、先ほども言ったように "*" の前に文字がないので、不正な正規表現となり、実行時例外が発生します。
    これは "\w" が何にマッチするか以前の話です。
記事No.85005 のレス /過去ログ145より / 関連記事表示
削除チェック/

■85027  Re[8]: 正規表現の考え方がわかりません
□投稿者/ ペイビン -(2017/09/05(Tue) 18:20:05)
    2017/09/05(Tue) 18:25:09 編集(投稿者)

    ≪パターンを修正しました≫
    僕なら、すべてを正規表現に頼ろうとせず、パターンを
    "{X=(?<X>.+?),\s*Y=(?<Y>.+?),\s*Width=(?<Width>.+?),\s*Height=(?<Height>.+?)}"
    のようにして、X, Y, Width, Heightに割り当てられる内容を後で吟味して
    rectを求めます。
    なお、「.+?」は、「.+」の最短マッチと言います。
    例えば、検索テキスト文字列が"{X=0, Y=0, Width=0, Height=0}あいうえおかきくけこ{X=1, Y=2, Width=3, Height=4}さしすせそ"
    のような場合で、複数のマッチを検索したい場合は、この最短マッチの概念が必要となりますが、
    必要に応じ調べてください。

    ところで、検索したいテキストは、
    X, Y, Width, Heightの順序は固定なのですよね?
    恐らく、今回のケースでは、"{X=1, Y=2, Width=3, Height=4}"
    のパターンで事足りるのだろうと思いますが、
    もし、{Y=2, X=1, Height=4, Width=3}のようなパターンがあり得るなら、
    これも考慮する必要があります。
記事No.85005 のレス /過去ログ145より / 関連記事表示
削除チェック/

■85121  Re[9]: 正規表現の考え方がわかりません
□投稿者/ 夜叉丸 -(2017/09/12(Tue) 09:43:41)
    No85027 (ペイビン さん) に返信

    > ところで、検索したいテキストは、
    > X, Y, Width, Heightの順序は固定なのですよね?
    > 恐らく、今回のケースでは、"{X=1, Y=2, Width=3, Height=4}"
    > のパターンで事足りるのだろうと思いますが、
    > もし、{Y=2, X=1, Height=4, Width=3}のようなパターンがあり得るなら、
    > これも考慮する必要があります。

    もともと保存される文字列は
    Rectangle の ToString() での文字列です。
    なので、X, Y, Width, Height だと私は思っています。
記事No.85005 のレス /過去ログ145より / 関連記事表示
削除チェック/

<前の20件

<< 0 | 1 >>

パスワード/

- Child Tree -