【问题标题】:How to get everything in the string, but a particular pattern如何获取字符串中的所有内容,但特定模式
【发布时间】:2011-06-05 09:37:01
【问题描述】:

又一个正则表达式问题:

我有一个字符串如下,

"This is a string, and I have a priority !1"

所以我想构建一个正则表达式来提取我的优先级,即这个数字 1 前面有“!”。 提取它很容易,“!([1-4])”。但现在我想提取文本,把它排除在外!我该怎么做?

DETAIL:!1 可以在字符串中的任何位置,所以这也很好:

"This is a string, !1 and I have a priority"

谢谢!

更新:我正在使用 scala

【问题讨论】:

    标签: java regex scala


    【解决方案1】:
    (.*?)!([1-4])(.*?)
    

    此正则表达式使用lazy quantifiers 以获得更好的性能,并为您提供三个捕获组:

    • !1 标记之前的文本(实际上是字符串中第一次出现标记之前的文本)。
    • 标记本身
    • 标记后面的文本

    您也可以使用像 jarnbjo 在他的回答中提到的 String.replace()Matcher.appendReplacement() 之类的东西,但无论如何,这三个组都能满足您的需求。

    编辑:这是正则表达式的正确版本:

    (.*?)!([1-4])(.*)
    

    基于 cmets,我将第二个量词设为 greedy,以便与字符串的其余部分匹配。

    【讨论】:

    • 我也想过这个,但是之后我必须连接几个组,因为优先级不会是唯一的嵌入模式..
    • 如果你有几个嵌入的模式,你可以用 jarnbjo 指出的 replaceAll 删除它们,但如果你还需要查找和分析这些模式,那么你已经必须至少扫描整个字符串一次.
    • 为什么你认为惰性量词让这个正则表达式更高效?在我看来,它们同样可能降低性能。此外,第二个 (.*?) 永远不会匹配任何内容。作为正则表达式中最后一件事的惰性量词永远没有意义;它将总是匹配允许的最小字符数,在这种情况下为零。
    • 你是对的,最后一个限定符不必是惰性的,但它确实会匹配一些文本,而不仅仅是零个字符。第一个量词懒于减少回溯的次数。如果它是所有格,它将匹配整个字符串,然后才回溯到第一个标记
    • 我认为你的意思是贪婪,而不是占有;所有格量词从不回馈任何东西。而您的第二个(.*?) 将匹配零个字符除非 某些东西迫使它匹配更多,例如锚点 ($)。 Java 的matches() 方法在两端隐式锚定匹配,但如果使用find(),组#3 将始终为空。所以,根据你使用的方法,第二个(.*?)要么没有意义,要么没用。
    【解决方案2】:

    您可以将 !1、!2、!3 和 !4 替换为空字符串:

    String newString = "some string with !1 and more text".replaceAll("![1-4]", "");

    【讨论】:

    • 我一直在寻找一种干净且可维护的方式来做到这一点.. =D
    • 您发现什么无法维护?如果有一个方法并且第一个参数被外部化,这对我来说似乎是合理的。但我不知道你的所有要求。
    • @José 你想要字符串,除了!1 之外的所有内容,不是吗?替换将完全做到这一点。这不像字符串是可变的,并且您以某种方式丢失了原始字符串。
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    相关资源
    最近更新 更多