2

オブジェクトの一部のプロパティがオプションであるオブジェクトを記述したファイルがあります。例 (色はオプションです):

type=dog
sex=male
name=wolf
color=brown
type=dog
sex=male
name=bob
type=cat
sex=male
name=tom
color=black
type=dog
sex=female
name=simona
color=white

犬の「名前」と「色」のプロパティのペアを提供する正規表現を探しています。私はこのようなものを待っています:

wolf - brown
bob - 
simona - white

私はから始めました

type=dog[\s\S]*?name=(\w+)[\s\S]*?color=(\w+)

これは間違っています:

wolf - brown
bob - black
simona - white

次に、色からグループを作成し(同じ結果になります)、「?」を追加しました。数量詞:

type=dog[\s\S]*?name=(\w+)[\s\S]*?(color=(\w+))?

しかし、望ましい結果ではなく、すべての試合で 2 番目のグループに敗れました。

wolf - 
bob - 
simona - 

私の表現の何が問題なのか、どうすれば目標を達成できるのか。後読み、先読み、および条件分岐は使用しないでください。VBScript はそれらを実装しません。

regex101.com での私の例

4

1 に答える 1

0

regex.Multiline = True次の正規表現を設定して使用します。

^type=dog[\s\S]*?^name=(\w+)(?:(?:(?!^type=)[\s\S])*?^color=(\w+))?

正規表現のデモを見る

詳細

  • ^- 行頭
  • type=dog- 文字列
  • [\s\S]*?- 0 以上の文字はできるだけ少なく
  • ^ - 行頭
  • name= - リテラル文字列
  • (\w+)- グループ 1: 任意の 1 つ以上の文字、数字、またはアンダースコア
  • (?:(?:(?!^type=)[\s\S])*?^color=(\w+))?- の 1 回または 0 回の出現に一致するオプションの非キャプチャ グループ
    • (?:(?!^type=)[\s\S])*?type=-行頭で部分文字列を開始しない任意の文字、0 回以上、できるだけ少ない回数
    • ^color=-color=部分文字列の行頭
    • (\w+)- グループ 2: 任意の 1 つ以上の文字、数字、またはアンダースコア
于 2020-08-17T11:00:05.123 に答える