2016-02-23 110 views
-2

我做一个Perl的正则表达式的问题改变\字符遵循以下规则:Perl的正则表达式mathjax语法

  1. 的匹配序列应该用\(
  2. 开始它应与\)
  3. 任何\结束前一匹配序列中的字符应替换为双反斜杠\\

示例文本参考:

Se la \probabilità dell'evento\ A è \(\frac{3}{4} \) e la 
probabilità dell'evento B è \(\frac{1}{4}\)  
\(\frac{3}{4} +\frac{3}{4}\) . 
\(\frac{1}{4} - \frac{3}{4}\) . 
\(\frac{3}{16}\) . 
\(\frac{1}{2}\) . 

应该改为:

Se la \probabilità dell'evento\ A è \\(\\frac{3}{4} \\) e la 
probabilità dell'evento B è \\(\\frac{1}{4}\\)  
\\(\\frac{3}{4} +\\frac{3}{4}\\) . 
\\(\\frac{1}{4} - \\frac{3}{4}\\) . 
\\(\\frac{3}{16}\\) . 
\\(\\frac{1}{2}\\) . 

到目前为止,这是我最好的选择:

s/(\\\()(.*)(\\)(.*)(\\\))/\\\\\($2\\\\$4\\\\\)/mg 

主要生产:

Se la \probabilità dell'evento\ A è \\(\\frac{3}{4} \\) e la 
probabilità dell'evento B è \\(\\frac{1}{4}\\)  
\\(\frac{3}{4} +\\frac{3}{4}\\) . 
\\(\frac{1}{4} - \\frac{3}{4}\\) . 
\\(\\frac{3}{16}\\) . 
\\(\\frac{1}{2}\\) . 

,你可以见

\\(\frac{3}{4} +\\frac{3}{4}\\) . 
\\(\frac{1}{4} - \\frac{3}{4}\\) . 

是错误的。

如何修改我的正则表达式以适应我的需求?

+4

这将是一个有效的问题,如果你的后样品的输入和输出它,“我尝试使用下面的代码继续:.......但未能匹配以下情况:.........。我应该如何修改我的代码以适应这种情况呢?“正如所写,这是一个需要完成的工作规范,而不是要求你正在处理的代码的指导的问题。 – DavidO

+0

对不起,我忘了添加我的尝试到目前为止,我只是编辑了问题 – LaboDJ

+0

它可以用'$ string =〜s /(?x)(?:(?!\ A)\ G [^ \\] * \ K \\ | \\ (?= \())(?=。*?(?<= \\)\))/ \\\\/g;' – sln

回答

1

发布从我原来的一个更新的正则表达式。

原来的验证结果为所有逃脱。
看了之后,它可以通过一次确认
找到开始块来加快速度。

底部是一个比较两种方法的基准。

更新的正则表达式:

$str =~ s/(?s)(?:(?!\A)\G(?!\))[^\\]*\K\\|\\(?=\(.*?\\\)))/\\\\/g;

Formatted and tested:

(?s)    # Dot-All modifier 
(?:    # Cluster start 
     (?! \A)   # Not beginning of string 
     \G     # G anchor - If matched before, start at end of last match 
     (?! \))   # Last was an escape, so ')' ends the block 
     [^\\]*    # Many non-escape's 
     \K     # Previous is not part of match 
     \\     # A lone escape 
    |     # or, 
         # New Block Check - 
     \\     # A lone escape then, 
     (?=    # One time Validation: 
      \(    # an opening '(' 
      .*?    # anything 
      \\ \)    # then a final '\)' 
    )     # ------------- 
)     # Cluster end 

基准:

样品\(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \)

结果

New Regex: (?s)(?:(?!\A)\G(?!\))[^\\]*\K\\|\\(?=\(.*?\\\))) 
Options: <none> 
Completed iterations: 50/50  (x 1000) 
Matches found per iteration: 31 
Elapsed Time: 1.25 s, 1253.92 ms, 1253924 µs 


Old Regex: (?s)(?:(?!\A)\G[^\\]*\K\\|\\(?=\())(?=.*?(?<=\\)\)) 
Options: <none> 
Completed iterations: 50/50  (x 1000) 
Matches found per iteration: 31 
Elapsed Time: 3.95 s, 3952.31 ms, 3952307 µs 
1

我测试@sln正则表达式

s/(?x)(?:(?!\A)\G[^\\]*\K\\|\\(?=\())(?=.*?(?<=\\)\))/\\\\/g; 

而且似乎工作,但它仍然是一个神秘的谜给我。

更新与解释

Formatted and tested:

(?s)    # Inline Dot-All modifier 
(?:    # Cluster start 
     (?! \A)   # Not beginning of string 
     \G     # G anchor - If matched before, start at end of last match 
     [^\\]*    # Many non-escape's 
     \K     # Previous is not part of match 
     \\     # A lone escape 
    |     # or, 
         # Start of an opening '\(' 
     \\     # A lone escape 
     (?= \()   # followed by an open parenth 
)     # Cluster end 
(?=    # Lookahead, each match validates a final '\)' 
     .*? 
     (?<= \\) 
     \) 
) 
+1

将'(?x)'改为'(?s)'这并不是一个谜,我会更新你的文章一个解释。 – sln

+1

我发布了一个更快的变体蚂蚁正则表达式,如果你有兴趣。 – sln

+0

@sln是的,非常感谢 – LaboDJ