2

我需要下一个字符串的正则表达式:

caption
"caption"
<caption>
[caption]
(caption)
etc

在这种情况下,标题是 [a-zA-Z]。我可以对相同的符号使用反向引用,但是我应该对像, ,等"成对符号做什么?()[]<>

4

4 回答 4

3

如果您的正则表达式引擎支持条件,则可以这样做:

(?:(")|(<)|(\[)|(\())[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
于 2013-05-28T07:46:10.537 回答
2

您需要明确指定它..

\[[a-zA-Z]+\]|\<[a-zA-Z]+\>|"[a-zA-Z]+"|\([a-zA-Z]+\)
于 2013-05-28T07:38:46.020 回答
2

一个模式没有机会知道,哪两个不同的字符属于一起。您必须交替列出这些情况:

(["'])[a-zA-Z]*\1|<[a-zA-Z]*>|\[[a-zA-Z]]*\]|\([a-zA-Z)]*\)

在 Regexr 上查看

于 2013-05-28T07:39:40.127 回答
0

我相信除非有很多人才能做到这一点|

<[a-zA-z]+>|\[[a-zA-z]+\]|\([a-zA-z]+\)

或冒着更多误报的风险

[<\[\(][a-zA-z]+[>\]\)]

如果您需要此替换,许多编程语言都支持回调函数

http://docs.python.org/2/library/re.html#re.sub

如果 repl 是一个函数,则每次出现不重叠的模式时都会调用它。该函数采用单个匹配对象参数,并返回替换字符串。例如:

于 2013-05-28T07:41:58.863 回答