正则表达式删除除某个标记之外的控制字符

时间:2014-05-15 09:15:36

标签: java regex

我在加载和反序列化时从字符串中删除控制字符。 我使用以下正则表达式执行此操作,这很好:

\\p{C}

问题是文本的一部分意味着在其中有新的行。所以我需要做的是删除所有控制字符,除非它们介于<Text></Text>之间。

如何使用正则表达式执行此操作?

3 个答案:

答案 0 :(得分:3)

您可以使用

replaceAll("(?s)(<Text>.*?</Text>)|\\p{C}", "$1")

我们的想法是跳过Text标记内容并将其留下(将它们替换为自己)。因此,如果我们遇到\\p{C},我们就知道它不在其中。

<强>解释

  • (?s)激活&#34;点匹配所有&#34;,因此.也会匹配换行符
  • (<Text>.*?</Text>) 捕获第一组中的文本节点。我们通过$1
  • 替换此捕获的结果
  • 如果我们匹配\\p{C},则表示我们不在Text节点中。因此,我们将$1替换为空(<Text>.*?</Text>),因为{{1}}在替换中不匹配。

Ideone插图:http://ideone.com/xKZgsn

答案 1 :(得分:0)

您可以使用此正则表达式:

/(?!<text[^>]*?>)(\p{C}+)(?![^<]*?<\/text>)/gi

但是,正如@fge所提到的,最好是干净地解析你的输入。

答案 2 :(得分:0)

这是我必须测试除去控制字符的正则表达式模式的字符串。

  

AAU吗?Aasddsaustw3h,kdf134dfswdesdfent?

似乎正则表达式模式"[[:cntrl:]]"运作良好。 string.replaceAll("[\u0000-\u001f]", "")仅替换其中的一部分。 "\p{Cntrl}"只需在“ wecty”之后替换空字符串。

谁能告诉我那些控制字符是什么?我可以替换它们,但不知道它们是什么。 Jave在线正则表达式测试显示匹配了11个控制字符。 https://www.freeformatter.com/java-regex-tester.html#ad-output