4

次のケースに一致する正規表現 (C#) を探しています。

  • {あ}
  • {a:b}
  • {a:{b}}
  • {a:{b:c}}
  • {a}{b}

  • {a}{b}{c}
  • a{b}

  • {a}b
  • {b}{c}
  • {a}b{c}
  • {a}{b}c

a、b、c は任意の文字列にできます。

これまでのところ、次のようなものがあります: .*[\{].+?[\}].*しかし、これは、 {a}{という 2 つの一致を返す代わりに、ケース{a}{b}に完全に一致します。 b}

この式は、文字列がコード化された文字列であることを確認するために使用されます。そうである場合は、コード化された文字列 (Regex.Matches() が便利です) から個別の断片を取得し、それらを解析する必要があります。

4

2 に答える 2

1

サンプル文字列の各文字を単純に解析し、ネストされた深さを追跡するルーチンを作成することもできます。

Powershell の例

PowerShell コンソールが手元にあるので、この PowerShell サンプルを提供します。これは、関数がどのように機能するかを示すためだけのものです。

$string = '{a}
{a:b}
a:{b}g{h}ik
{a:{b:c}}
{a}{b}
{a}{b}{c}
{a{b{c}}}{{{d}e}f}
'

$intCount = 0

# split the string on the open and close brackets, the round brackets ensure the squiggly brackets are retained
foreach ($CharacterGroup in $string -split "([{}])") {
    write-host $("+" * $intCount)$CharacterGroup
    if ($CharacterGroup -match "{") { $intCount += 1 }
    if ($CharacterGroup -match "}") { $intCount -= 1 }
    if ($intCount -lt 0) { 
        Write-Host "missing close bracket"
        break
        } # end if
    } # next $CharacterGroup

収量

 {
+ a
+ }


 {
+ a:b
+ }

a:
 {
+ b
+ }
 g
 {
+ h
+ }
 ik

 {
+ a:
+ {
++ b:c
++ }
+ 
+ }


 {
+ a
+ }

 {
+ b
+ }


 {
+ a
+ }

 {
+ b
+ }

 {
+ c
+ }


 {
+ a
+ {
++ b
++ {
+++ c
+++ }
++ 
++ }
+ 
+ }

 {
+ 
+ {
++ 
++ {
+++ d
+++ }
++ e
++ }
+ f
+ }
于 2013-06-06T00:58:02.217 に答える