【问题标题】:Exclude a chunk enclused in a string in regular expression在正则表达式中排除包含在字符串中的块
【发布时间】:2018-01-15 10:44:21
【问题描述】:

我有一个类似的文字:

其中标记文本之前应该匹配,但<tag>标记 不应在标签</tag> 内匹配。 标记也应该匹配 标签之后。 <tag>这个标记不应该匹配</tag>

对于这个文本示例,标记的粗体实例应该匹配,但不是<tag> 中的实例。 我能去的最近的是https://regex101.com/r/CyxVZ3/1,它忽略了</tag>之前的所有匹配项。

来自 cmets 的一些更新:

  • <tag>..</tag> 可能会出现多次
  • <tag> 的嵌套不会 在那里。
  • 首选语言是 JAVA。

【问题讨论】:

  • 您不能通过代码以编程方式找到第一个和最后一个匹配项吗?
  • first 和 last 仅用于此示例,我已经更新了问题。
  • <tag> </tag> 可以出现多次吗?
  • 是的,它可以出现多次
  • <tag> 可以嵌套吗?例如:<tag>Some text <tag>no match</tag> <tag>marked</tag></tag>。如果可以,您应该使用 XML 解析器,而不是正则表达式

标签: regex


【解决方案1】:

如果引擎支持回溯控制动词(Perl、PHP):

<tag>.*?<\/tag>(*SKIP)(?!)|(?:(?!<tag>).)*

否则,一个正则表达式是不可能的,它需要更多的代码。

在 java 7 中读取 cmets 后,可以使用扫描仪并使用正则表达式作为分隔符来完成,例如:

String string = "In which marked text should match before, but <tag>marked should not match inside a tag</tag>. Also marked should matched after the tag.<tag>This marked should not match either</tag> done";
try ( Scanner scanner = new Scanner( string ) ) {
    scanner.useDelimiter( "<tag>.*?</tag>" );
    while ( scanner.hasNext() ) {
        System.out.println( scanner.next() );
    }
}

【讨论】:

  • 正好需要第一部分(java中不支持:(),对于java部分,我们将不得不再次重建字符串..
猜你喜欢
  • 1970-01-01
  • 2020-04-22
  • 2017-04-13
  • 2021-07-29
  • 2018-03-08
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多