与许多人一样,我正在努力解决似乎是“琐碎”的正则表达式问题。 在给定的文本中,每当我在{}括号内遇到一个单词时,都需要将其提取。起初,我使用
"\\{-?(\\w{3,})\\}"
效果很好:
只要单词没有空格或特殊字符(如')。 例如,{Project}返回Project。但是{Project Test}或{Project D'arce}不返回任何内容。 我知道对于白色字符,我需要使用\ s。但是对于我来说,如何添加上述内容绝对不清楚,我尝试过:
"%\\{-?(\\w(\\s{3,})\\)\\}"))
但不起作用。如果我要添加包含特殊字符(如'???)的单词怎么办?真令人沮丧
答案 0 :(得分:3)
如何匹配{..}
中不是}
的任何字符?
为此,您可以像[^..]
一样使用negated character class [^}]
。这样您的正则表达式可以看起来像
"\\{[^}]{3,}\\}"
但是,如果您只想将正则表达式限制为某些特定的字母,则还可以使用字符类来组合许多字符,甚至可以组合预定义的shorthand character classes,例如\w
\s
\d
等等。
因此,如果您想接受任何单词字符\w
或空格\s
或'
,则您的正则表达式可能类似于
"\\{[\\w\\s']{3,}\\}"
答案 1 :(得分:2)
您可以使用character class [\w\s']
并在其中添加您可以匹配的内容:
\{-?([\w\s']{3,})}
在Java中
String regex = "\\{-?([\\w\\s']{3,})}";
如果您只想防止匹配3个空格字符,则可以使用重复组:
\{-?\h*([\w']{3,}(?:\h+[\w']+)*)\h*}
关于图案
\{
匹配{
字符-?
可选的连字符\h*
匹配0+次水平空白字符([\w\s']{3,})
匹配3个或更多匹配单词char,空白char或'(?:\h[\w']+)*
重复0+次,匹配1+个水平空格字符,然后是字符类中列出的字符\h*
匹配0+次水平空白字符}
匹配}
在Java中
String regex = "\\{-?\\h*([\\w']{3,}(?:\\h+[\\w']+)*)\\h*}";