【问题标题】:RegExp - ignore string outside of tagsRegExp - 忽略标签外的字符串
【发布时间】:2013-11-05 23:30:55
【问题描述】:

我需要 Java RegExp,它可以匹配除标签 \begin{name} 和 \start{name} 之间的文本之外的所有内容,如下所示(标签可以嵌套):

\start{A}
  im inside
\end{A}

im outside

\start{B}
  \start{B1}
    im inside
  \end{B1}
  im inside
\end{B}

im outside

在这种情况下,表达式应该忽略所有 'im outside' 部分。 谁能帮我? 提前致谢!

【问题讨论】:

  • 这不是正则表达式的工作。它需要跟踪开始标签及其匹配的结束标签......是否保证标签总是正确匹配,如果不是你想做什么?另外,标签是否单独出现在一行中?
  • 嵌套标签可以同名吗?
  • @CasimiretHippolyte 我必须解析一个文件,其中嵌套标签的名称可能不同
  • @JimGarrison 正如我提到的,我必须解析一个文件,但我可以假设标签已正确匹配。

标签: java regex string extract


【解决方案1】:

类似:

"\\\\start\{([a-zA-Z_][a-zA-Z_0-9]*)\}(.*?)\\\\end\{$1\}"

带有 DOTALL 标志以确保您获得换行符。 里面是第2组。

这实际上无法使用正则表达式完成。 (当你匹配一个开始标签时,你需要递归地深入整个规则,这在正则表达式中是不可能的)。缺点是外部标签也出现在里面,第一个结束标签会匹配。

为此,您可以将标签与:

"\\\\start\{([a-zA-Z_][a-zA-Z_0-9]*)\}"

然后将标签名称检索为组 1。然后开始将您当前所在的标签存储在列表中。然后匹配结束标签为

"\\\\end\{([a-zA-Z_][a-zA-Z_0-9]*)\}"

并收集匹配标签之间的所有内容,同时确保标签匹配。

如果标签名称比标准标识符名称宽,您可以相应地更改[a-zA-Z_][a-zA-Z_0-9]*

如果你正在解析一个文件,你会想要这种方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多