Java 正则表达式,用于包装除某些给定字符之外的所有内容

Posted

技术标签:

【中文标题】Java 正则表达式,用于包装除某些给定字符之外的所有内容【英文标题】:Java regex for wrapping everything but some given character 【发布时间】:2013-01-14 22:27:33 【问题描述】:

我有一个字符串,例如

somet3x70rnumb3r5.3.1*@:ch4r5*

我需要将不是*(星号)的所有内容都包含一个模式引用\Q...\E,并将* 替换为.*。它应该给出这个:

\Qsomet3x70rnumb3r5.3.1\E.*\Q@:ch4r5\E.*

我可以通过字符串遍历、拆分*(或我指定的任何字符)以及逐步构建字符串来做到这一点,但如果可能的话,我想使用正则表达式和模式类实用程序。

另一个带有指定字符? 的示例将被. 替换:

123?4?

应该给

\Q123\E.\Q4\E.

我正在考虑使用组,但我需要在每个区域周围设置组,因为每个区域都必须被包裹或替换为另一个字符。

我的目标是从给定的String 创建一个模式String,但只考虑与指定字符匹配的区域并忽略其余区域(即使它包含正则表达式模式)。

【问题讨论】:

所以你基本上想用反斜杠转义匹配的字符串??喜欢...\somet3x70rnumb3r5.3.1.*\@:ch4r5\.*\123.\4. ?? ` 没有。我希望某个指定字符周围的字符串区域像\Q<string area>\E 一样被包裹,并且指定的字符被其他字符替换。 \Q---\E 被 Pattern 用来忽略其中的任何内容。 但是 AFAIK \Qanythinghere\E \anythinghere 在正则表达式世界.. 在这里查看docs.oracle.com/javase/tutorial/essential/regex/literals.html 我不知道,我认为它需要结束标记,但我只希望 Pattern 忽略 anythinghere,而考虑外部的所有内容。 我上面给出的例子包含句号.。该字符将被视为模式匹配器中的任何字符,除非它在 ​​\Q\E 内,否则它将被视为文字。 【参考方案1】:

这样的?

String s = "abc*efg?123";
s = s.replaceAll("([^\\*\\?]+)", "\\\\Q$1\\\\E");
s = s.replaceAll("\\*", ".*");
s = s.replaceAll("\\?", ".");

\Qabc\E.*\Qefg\E.\Q123\E 中的结果

【讨论】:

这意味着在一个组中匹配除星号和问号之外的所有内容任意次数并用包装的版本替换它们? 是的,任何不是星号或问号的东西都将被包裹在 \Q 和 \E 中。这是你要求的吗? 仅供参考,您无需在括号内转义 ?*"([^*?]+)" 工作正常。在 Java 引擎上测试:fiddle.re/g6gu【参考方案2】:

如果您不担心构建单线,它会更简单。单线可能是可能的,但这会很痛苦。相反,我建议你这样做:

str = str.replaceAll("(?<!^)\\*(?!$)", "\\E.*\\Q")
         .replaceAll("(?<!^)\\?(?!$)", "\\E.\\Q");
str = "\\Q" + str + "\\E";

写起来更简单,也更容易理解。

【讨论】:

@SotiriosDelimanolis - 当然,这是一个零宽度后视断言。请查看this regular-expressions.info page 和this Stack Overflow question 以获得比我能够提供的更好的解释跟上。

以上是关于Java 正则表达式,用于包装除某些给定字符之外的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

用于从字符串中删除除“a”和“i”之外的所有单个字母的 Java 正则表达式 [关闭]

正则表达式:允许除某些选定字符之外的所有内容[重复]

java中,正则表达式,如何过滤除数字和字母之外的其它字符??

什么正则表达式将匹配除逗号','或分号';'之外的每个字符?

正则表达式匹配除 5 之外的所有数字字符

正则表达式 选中以某些字符开始,某些字符结尾的字符串