每当我需要带有正则表达式的东西时,我都会遇到困难......
现在,我需要转一些模糊文字...... 在旧的,非常古老的数据库中,某些系统不允许用户格式化他们的文本...因此,用户有创意,输入如下表达式:
S O M E T E X T I W O U L D L I K E T O H I G H L I G H T
我的问题是,如何将该文字转换为:
SOME TEXT I WOULD LIKE TO HIGHLIGHT
使用Java中的正则表达式。
对于这个愚蠢的问题感到抱歉,但我花了很多时间试图解决这个问题。
答案 0 :(得分:3)
这个正则表达式将在中间为您提供一个空格,即单词之间的单个空格。
String r = "S O M E T E X T I W O U L D L I K E T O H I G H L I G H T";
System.out.println(r.replaceAll("(\\s){2,}|\\s", "$1"));
<强>输出:强>
SOME TEXT I WOULD LIKE TO HIGHLIGHT
这背后的想法是,上面的正则表达式将捕获来自两个或更多连续空格和所有其他空格或进一步匹配的单个空间。用组索引1中的字符替换匹配的空格将为您提供所需的输出。
答案 1 :(得分:2)
使用一个模式,没有Lookaheads,没有单词边框锚点
text.replaceAll("\\s(\\s?)\\s*", "$1")
<强>解释强>
答案 2 :(得分:1)
如果单词由多个空格分隔,则可以使用负向前看
\s(?!\s)
<强>测试强>
"S O M E T E X T I W O U L D L I K E T O H I G H L I G H T"
.replaceAll("\\s(?!\\s)", "")
.replaceAll("\\s+", " ");
=> SOME TEXT I WOULD LIKE TO HIGHLIGHT
答案 3 :(得分:1)
所以你可以使用replaceAll("(.)\\s", "$1")
示例:
String s = "S O M E T E X T I W O U L D L I K E T O H I G H L I G H T";
s = s.replaceAll("(.)\\s", "$1");
System.out.println(s);
输出:SOME TEXT I WOULD LIKE TO HIGHLIGHT
说明:
将您的文字视为两个字符块(我将使用^^
和##
标记它们)。
S O M E T E X T
^^##^^##^^##^^##
如果你仔细观察,你会发现你想要从每一对中删除第二个字符(这是空格),并留下第一个字符:
S O M E T E X T
^ # ^ # ^ # ^ # T - T will not be affected (will stay)
because it doesn't have space after it.
您可以使用(.)\s
正则表达式
.
代表任何字符(包括空格)\s
代表任何空白这样,第一个字符将被放置在组中(索引为1
),这允许我们通过$x
在x
中使用来自此部分的匹配,其中(?<=\\S)\\s
表示组索引。< / p>
Ver.2 (如果要删除的空格不仅位于奇数索引位置)
解决此问题的其他方法是仅删除
这些空格紧跟在非空格字符S O M E T E X T
^ ^ ^ ^ ^ ^ ^
\\s(?=\\s)
放在其他空格S O M E T E X T
^ ^ ^ ^##### ^ ^ ^
s = s.replaceAll("(?<=\\S)\\s|\\s+(?=\\s)", "");
这样你可以看到剩下一个空格(单词就在word之前),所以你的解决方案看起来像
{{1}}
答案 4 :(得分:0)
如果保证所有字词之间都有 两个或更多 空格,那么:
首先,删除字符之间的所有空格
input.replaceAll("(?<=\\S)\\s(?=\\S)", "");
然后,只用一个
替换单词之间的所有多个空格input.replaceAll("\\s{2,}", " ");
因此,完整的代码看起来像
String input = "S O M E T E X T I W O U L D L I K E T O H I G H L I G H T";
input = input.replaceAll("(?<=\\S)\\s(?=\\S)", "").replaceAll("\\s{2,}", " ");
System.out.println(input); // SOME TEXT I WOULD LIKE TO HIGHLIGHT