我需要下一个字符串的正则表达式:
caption
"caption"
<caption>
[caption]
(caption)
etc
在这种情况下,标题是 [a-zA-Z]。我可以对相同的符号使用反向引用,但是我应该对像, ,等"
成对符号做什么?()
[]
<>
我需要下一个字符串的正则表达式:
caption
"caption"
<caption>
[caption]
(caption)
etc
在这种情况下,标题是 [a-zA-Z]。我可以对相同的符号使用反向引用,但是我应该对像, ,等"
成对符号做什么?()
[]
<>
如果您的正则表达式引擎支持条件,则可以这样做:
(?:(")|(<)|(\[)|(\())[A-Za-z]*(?(1)")(?(2)>)(?(3)\])(?(4)\))
并不是说这比@stema 或@Anirudh 提出的解决方案更具可读性:)
解释:
(?: # Match either...
(") # a quote, capture it in group 1
| # or
(<) # an opening angle bracket --> group 2
| # or
(\[) # an opening bracket --> group 3
| # or
(\() # on opening parenthesis --> group 4
) # End of alternation
[A-Za-z]* # Match any ASCII letters
(?(1)") # If group 1 matched before, then match a quote
(?(2)>) # If group 2 matched before, then match a closing angle bracket
(?(3)\]) # If group 3 matched before, then match a closing bracket
(?(4)\)) # If group 4 matched before, then match a closing parenthesis
您需要明确指定它..
\[[a-zA-Z]+\]|\<[a-zA-Z]+\>|"[a-zA-Z]+"|\([a-zA-Z]+\)
一个模式没有机会知道,哪两个不同的字符属于一起。您必须交替列出这些情况:
(["'])[a-zA-Z]*\1|<[a-zA-Z]*>|\[[a-zA-Z]]*\]|\([a-zA-Z)]*\)
我相信除非有很多人才能做到这一点|
<[a-zA-z]+>|\[[a-zA-z]+\]|\([a-zA-z]+\)
或冒着更多误报的风险
[<\[\(][a-zA-z]+[>\]\)]
如果您需要此替换,许多编程语言都支持回调函数
http://docs.python.org/2/library/re.html#re.sub
如果 repl 是一个函数,则每次出现不重叠的模式时都会调用它。该函数采用单个匹配对象参数,并返回替换字符串。例如: