2017-09-15 8 views
0

私は.texファイルを読み込み、別の.texファイルに保存するパターンに従って置き換えています。私の左の区切り文字はRegex perlで区切られたLaTeXテキストに一致する

\ket{ 

で、右の区切り文字は

} 

正規表現\\ket\{(.+)\}

 
\ket{0} 

を一致させることができますが、そのような

 
$\ket{\bfG \bfP^L_{2ex}}$, and the real space, $\ket{\bfP^L_{2ex}}$ 

のような複雑な線で、それが一致していますテ全体XT

\\ket{([^{}]*|[^}])*}{1,2} 

に正規表現を変更

 
\bfG \bfP^L_{2ex}}$, and the real space, $\ket{\bfP^L_{2ex} 

私が言及した複雑なラインを検出しますが、動作しないように

 
reciprocal lattice, $\ket{\bfG \bfP^L_{2ex}{3}{2}}$, and the real space, $\ket{\bfP^L_{2ex}}$ 

などのケースですることができます。これをどうすれば解決できますか?このような問題を解決するには、どのアルゴリズム/トピック/書籍/チュートリアルを読む必要がありますか?

+0

ステップ1:[regexes](https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)を使用して停止します。 https://en.wikipedia.org/wiki/Context-free_grammar#Examples – n0rd

+0

[誰かが私の質問に答えたときに何をすべきですか?](http://stackoverflow.com/help/someone-answers)を参照してください。 – zdim

答えて

2

均衡/ネストされた区切り文字の(複雑な)問題を手作業で解析しようとする代わりに、このツールを使用することをお勧めします。おそらく最初にコアText::BalancedまたはRegexp::Commonを見てください。その使用例については、this postを参照してください。また、必要なものに非常に近いものがあります。


この場合、文字列の特定のプロパティを使用して、この問題を回避できます。この式は常にインラインである場合

、それは「sは問題

use warnings; 
use strict; 
use feature 'say'; 

my $line = q( 
    $\ket{\bfG \bfP^L_{2ex}}$, and the real space, $\ket{\bfP^L_{2ex}}$ 
); 

my @kets = $line =~ m| \$\\ket{ (.+?) }\s*\$ |gx; 

say for @kets; 

これはプリントを解決し、それら$$...$との間にある

 
\bfG \bfP^L_{2ex} 
\bfP^L_{2ex} 

必要なテキストは単純であるので、これは簡単です。リテラル$\ket{と最初の次の間}$の間。内部に何があるかの問題はないので、ネストされたデリミタに問題はありません。

.+?は、次のパターンまでのすべての文字と一致します。ここでは}$(オプションのスペースは、\s*)です。 $\はエスケープする必要があります。 |x修飾子を使用すると、スペースを読みやすくすることができます。

関連する問題