标题中的双“管”
在我今天的工作中,我意识到我们网页的标题有点小错误。我们的网站是使用.jsp页面和我们使用的产品页面的标题构建的标题中的双“管”
在我们的管理员(我们可以为每个产品设置标题)中,我们通常会添加*任何遇到的人这个问题之前,如果是这样,有没有人知道一种方法来解决我遇到的双管道问题?
问题是,该方法的replaceAll具有作为第一个参数的正则表达式。 “|”是正则表达式中的保留符号,如果要将其用作字符串文字,则必须将其转义。您可以创建解决方法,例如这种方法。
String[] words = str.split(" ");
for (int i = 0; i < words.length; i++) {
if (words[i].length() > 0) {
if (!(words[i].substring(0, 1).equals("|"))) {
sb.append(words[i].replaceFirst(words[i].substring(0, 1), words[i].substring(0, 1).toUpperCase()) + " ");
} else {
sb.append(words[i] + " ");
}
}
}
感谢Nightsorrow。我刚刚尝试了你的建议,但似乎实际上删除了|全部一起。 –
哎。是的,你是对的,我忘了其他块。编辑。 – balent
尝试使用管道字符¦
的html转义码。
您的标题是:
"Monkey Thank You ¦ Monkey Thank You Cards"
我认为这个问题是这样一个事实:replaceFirst()
需要一个正则表达式作为参数,并替换字符串。因为你的第一个字符推的是正则表达式的参数,与竖线发生的事情是(遗漏增加了StringBuffer
)等价于:
String addedToBuffer = "|".replaceFirst("|", "|".toUpperCase());
会发生什么事的话,就是我们有匹配的正则表达式空字符串或空字符串。那么,任何字符串匹配空字符串正则表达式。所以比赛被替换为“|” (大写)。所以"|".replaceFirst("|", "|".toUpperCase())
扩大到"||"
。因此,append()
调用的参数为"|| "
。
您可以修复有两种方式你的算法:
- 自动修复正则表达式,使用
\Q
和\E
之间的文字符号。所以你的正则表达式传递到replaceFirst()
变成类似"\\Q"+ literal + "\\E"
。 -
意识到你不需要正则表达式。而是使用两个
append()
操作。一到append()
转换后的案例第一个要添加的项目字符,另外要追加其余的。这看起来是这样的:for(String s:items){ if(s.equals(“”)){ sb.append(“”); } else { sb.append(Character.toUpperCase(s.charAt(0))); (s.length()> 1)sb.append(s.substring(1));(s.length()> 1)sb.append(s.substring(1)); } sb.append(“”); }}
第二种方法可能是更容易跟踪为好。
PS:出于某种原因,StackOverflow编辑器强烈反对列表中的代码块。如果有人碰巧知道如何解决冗长的格式化...?
你能发布Strings.toTitleCase的代码吗? – beny23
您是否确定添加双管道的位置?当你调试该行时,输入是否只有1个管道,输出是2? – cdeszaq
@LouisStephens - “字符串”不是本地Java类型。 'String'(没有“s”是),但是没有'toTitleCase()'方法。这可能是一个提供“Strings”类的库。 – cdeszaq