我有一个字符串,我想大写所有未引用的内容。
示例:
我的名字是'Angela'
结果:
我的名字是'Angela'
目前,我匹配每个引用的字符串,然后循环和连接以获得结果。
是否可以在一个正则表达式中实现这一点,可能使用替换?
答案 0 :(得分:2)
WebContent
输入:'s'Hello这是'Java'不是'.NET'
输出:'s'HELLO这是'Java'不是'.NET'
答案 1 :(得分:0)
你可以使用这样的正则表达式:
([^'"]+)(['"]+[^'"]+['"]+)(.*)
# match and capture everything up to a single or double quote (but not including)
# match and capture a quoted string
# match and capture any rest which might or might not be there.
这显然只适用于一个带引号的字符串。查看有效的demo here。
答案 2 :(得分:0)
确定。这将为你做.. ..效率不高,但适用于所有情况。我实际上不建议这个解决方案因为它太慢了。
public static void main(String[] args) {
String s = "'Peter' said, My name is 'Angela' and I will not change my name to 'Pamela'.";
Pattern p = Pattern.compile("('\\w+')");
Matcher m = p.matcher(s);
List<String> quotedStrings = new ArrayList<>();
while(m.find()) {
quotedStrings.add(m.group(1));
}
s=s.toUpperCase();
// System.out.println(s);
for (String str : quotedStrings)
s= s.replaceAll("(?i)"+str, str);
System.out.println(s);
}
O / P:
'Peter' SAID, MY NAME IS 'Angela' AND I WILL NOT CHANGE MY NAME TO 'Pamela'.
答案 3 :(得分:0)
添加@jan_kiran的答案,我们需要调用
appendTail()
方法appendTail()。更新的代码是:
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("\\'(.*?)\\'");
String input = "'s'Hello This is 'Java' Not '.NET'";
Matcher regexMatcher = regex.matcher(input);
StringBuffer sb = new StringBuffer();
int counter = 0;
while (regexMatcher.find())
{// Finds Matching Pattern in String
regexMatcher.appendReplacement(sb, "{"+counter+"}");
matchList.add(regexMatcher.group());// Fetching Group from String
counter++;
}
regexMatcher.appendTail(sb);
String formatted_string = MessageFormat.format(sb.toString().toUpperCase(), matchList.toArray());
答案 4 :(得分:0)
我对这些解决方案并不满意,因为它们似乎删除了未引用的结尾文本。 该代码对我有用,并且通过记住最后一个引号类型来处理'和'。当然,适当地替换toLowerCase ...
也许这太慢了;我不知道:
private static String toLowercaseExceptInQuotes(String line) {
StringBuffer sb = new StringBuffer(line);
boolean nowInQuotes = false;
char lastQuoteType = 0;
for (int i = 0; i < sb.length(); ++i) {
char cchar = sb.charAt(i);
if (cchar == '"' || cchar == '\''){
if (!nowInQuotes) {
nowInQuotes = true;
lastQuoteType = cchar;
}
else {
if (lastQuoteType == cchar) {
nowInQuotes = false;
}
}
}
else if (!nowInQuotes) {
sb.setCharAt(i, Character.toLowerCase(sb.charAt(i)));
}
}
return sb.toString();
}