1

正規表現を使用して、属性を持たない不完全な xml タグを見つけようとしています。これまでのところ、この正規表現を思い付くことができましたが、それではうまくいき</?\s*([a-zA-Z0-9]?:\s+)?[a-zA-Z0-9]*(?!>)ません。このようなxmlでは: <abc> </abc> <ab> </ab <s:ab

</abandに一致させたい<s:ab(両方とも末尾に ">" がないため)。C#で正規表現を使用してこれを行う方法はありますか?

4

3 に答える 3

1

あなたはかなり近いです。あなたの主な問題は、否定的な先読みが失敗したときにパターンがバックトラックすることです。これは、先読みの前の部分を非バックトラッキングのアトミック グループに置くことで回避できます: (?>no backtracking in here).

例えば:

(?xi)                   # turn on eXtended (ignore spaces/comments) and case-Insensitive mode
(?>                     # don't backtrack
  < /?                  # tag start (no space allowed after it)
  [a-z0-9]+             # tag name/space
  (?: : [a-z0-9]+ )?
  \s*                   # optional spaces
)
(?! > )                 # no ending

これは で一致することに注意して<fooください<foo bar>

于 2013-03-11T19:02:24.433 に答える
0

人々が言っ​​たように、これはおそらく実りのない試みです。XML は正規の言語ではないからです。ただし、問題の一部は先読みです。直後に閉じ山括弧が続かないことを確認するだけです。これは、 of のようなものが不要な場合でも一致することを意味<ab<abc>ます。そのため、先読みにタグ構造全体を含める必要があります。

あなたが与えた正確なデータの一致を取得するには、正規表現を使用できます。

#</?([a-z]?:)?[a-z]*(?!/?([a-z]?:)?[a-z]*>)#

ここで実際に見ることができます。ここで重要なのは、正規表現エンジンが後戻りして (たとえば、1 文字をドロップして) 先読みを検証できないようにすることです。これを行う方法は他にもあります。たとえば、通常のバックトラッキング プロセスで一致したトークンを放棄することを拒否する所有量指定子などがありますが、標準の .NET エンジンは所有一致をサポートしていません。これはアトミック グループをサポートします。これは同じように動作しますが、量指定子の代わりにグループを使用します。ここで、タグの開始部分全体をアトミック グループでラップしたことがわかります。( (?> ... ))

#(?></?([a-z]?:)?[a-z]*)(?!>)#

タグをどのようにフォーマットするかについて、独自の正規表現を自由に入力できますが、この正規表現はすでに読み取り可能なコードの限界を押し上げていると言わざるを得ません。正当な xml タグ名をいじると、さらに限界が押し上げられます。その方向に。それにもかかわらず、これがエラーに光を当てるのに役立つことを願っています.

于 2013-03-11T19:05:27.617 に答える
0

単一の xml ファイルでエラーを見つけようとしているだけの場合は、Google Chrome Web ブラウザーで開いてみてください。エラーのある行が表示されます。

しかし、コードで処理しなければならないファイルがたくさんある場合は、正規表現よりも強力なものが必要になります。

于 2013-03-11T16:42:58.220 に答える