给定终止令牌<term> ::= "()\n}"
,
是否可以匹配
"{" <anything-except-term> <term>
使用Java正则表达式?
编辑:更具体地说,我有一个表格
的源文件(Scala,正好相反){
...
()
}
其中...
是&#34; Scala代码的所有其余部分。
我真正想要的是提取...
位,但我会满足于只匹配整个事物。
答案 0 :(得分:2)
匹配"{" <anything-except-term> <term>
的正则表达式,其中<term>
为"()\n}"
非常简单:
\{ Match "{"
.*? Match anything, but stop as soon as the following matches
\(\)\n\} Match <term>, i.e. "()\n}"
现在,您可能也希望捕获内容,因此添加()
捕获组。
.
实际上并不匹配&#34;任何&#34;除非您启用DOTALL
模式,这可以通过添加(?s)
来内联完成。
从技术上讲,你不需要逃离}
。
因此,结果是:(?s)\{(.*?)\(\)\n}
作为Java文字,即:"(?s)\\{(.*?)\\(\\)\n}"
请参阅regex101了解演示。
答案 1 :(得分:0)
使用钢化点,虽然昂贵是一个很好的解决方案:
\{((?:(?!\(\)\s+\})[\s\S])*)
说明:
\{ # Match a literal {
( # Start capturing group (1)
(?: # Start no capturing group (a)
(?!\(\)\s+\}) # If immediate next positions are not going to be a ()\n}
[\s\S] # If yes match next character
)* # Repeat it zero or more times - End of non-capturing group (a)
) # End of capturing group (1)
作为Java字符串:
\\{((?:(?!\\(\\)\\s+\\})[\\s\\S])*)
我只使用\s
代替\r?\n
。你可能想要改变它。
答案 2 :(得分:0)
这将只提取您想要的输入(在一行中):
String guts = input.replaceAll("(?s).*?(?<=\\{\\R).*(?=\\R\\(\\)\\R}).*", "$1");
我已经使用\R
(在Java 8中引入)来匹配&#34;换行符&#34;在任何平台上。
这需要匹配输入,如果不是原始字符串,则按原样返回。如果你想获得幻想并在没有匹配的情况下返回空格,请将重要位置为可选项,以便总是匹配:
String guts = input.replaceAll("(?s).*?(?:(?<=\\{\\R).*(?=\\R\\(\\)\\R}))?.*", "$1");