Java正则表达式匹配除固定终端之外的所有内容

时间:2016-09-01 18:23:07

标签: java regex

给定终止令牌<term> ::= "()\n}", 是否可以匹配

"{" <anything-except-term> <term>

使用Java正则表达式?

编辑:更具体地说,我有一个表格

的源文件(Scala,正好相反)
{
...
()
}

其中...是&#34; Scala代码的所有其余部分。

我真正想要的是提取...位,但我会满足于只匹配整个事物。

3 个答案:

答案 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。你可能想要改变它。

Live demo

答案 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");