我在加载和反序列化时从字符串中删除控制字符。 我使用以下正则表达式执行此操作,这很好:
\\p{C}
问题是文本的一部分意味着在其中有新的行。所以我需要做的是删除所有控制字符,除非它们介于<Text>
和</Text>
之间。
如何使用正则表达式执行此操作?
答案 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