Java 大写所有字符,但不包括带引号字符串中的字符
我有一个字符串,我想大写所有没有被引用的 例如: 我叫‘安吉拉’ 结果: 我叫‘安吉拉’ 目前,我正在匹配每个带引号的字符串,然后循环和连接以获得结果Java 大写所有字符,但不包括带引号字符串中的字符,java,regex,Java,Regex,我有一个字符串,我想大写所有没有被引用的 例如: 我叫‘安吉拉’ 结果: 我叫‘安吉拉’ 目前,我正在匹配每个带引号的字符串,然后循环和连接以获得结果 是否可以在一个正则表达式(可能使用replace)中实现这一点 可以使用如下正则表达式: ([^'"]+)(['"]+[^'"]+['"]+)(.*) # match and capture everything up to a single or double quote (but not including) # match and capt
是否可以在一个正则表达式(可能使用replace)中实现这一点 可以使用如下正则表达式:
([^'"]+)(['"]+[^'"]+['"]+)(.*)
# 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.
显然,这只适用于一个带引号的字符串。请参阅工作表。正常。这就够了。。效率不高,但适用于所有情况。实际上,我不建议使用这种解决方案,因为它太慢了
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);
}
List matchList=new ArrayList();
Pattern regex=Pattern.compile(“\\”(.*?\\”);
String input=“'s'Hello这是'Java'而不是.NET';
Matcher regexMatcher=regex.Matcher(输入);
StringBuffer sb=新的StringBuffer();
int计数器=0;
while(regexMatcher.find())
{//在字符串中找到匹配的模式
regexMatcher.appendReplacement(sb,“{”+计数器+“}”);
matchList.add(regexMatcher.group());//从字符串中提取组
计数器++;
}
字符串格式=MessageFormat.format(sb.toString().toUpperCase(),matchList.toArray());
系统输出打印项次(输入);
System.out.println(“-------------------------”);
System.out.println(格式);
输入:“s”你好,这是“Java”而不是“.NET”
输出:“s”您好,这是“Java”而不是“.NET”
再加上@jan_kiran的回答,我们需要打电话给 附尾 方法。更新代码为:
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());
List matchList=new ArrayList();
Pattern regex=Pattern.compile(“\\”(.*?\\”);
String input=“'s'Hello这是'Java'而不是.NET';
Matcher regexMatcher=regex.Matcher(输入);
StringBuffer sb=新的StringBuffer();
int计数器=0;
while(regexMatcher.find())
{//在字符串中找到匹配的模式
regexMatcher.appendReplacement(sb,“{”+计数器+“}”);
matchList.add(regexMatcher.group());//从字符串中提取组
计数器++;
}
regexMatcher.appendTail(sb);
String formatted_String=MessageFormat.format(sb.toString().toUpperCase(),matchList.toArray());
这些解决方案并没有给我带来好运,因为它们似乎删除了尾随的非引用文本。
这段代码适用于我,通过记住最后一个开头引号类型来处理“和”。当然,适当地替换为小写
也许这太慢了,我不知道:
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();
}
私有静态字符串toLowerCaseeExceptinQuotes(字符串行){
StringBuffer sb=新的StringBuffer(行);
布尔nowInQuotes=false;
char lastQuoteType=0;
for(int i=0;i
那么您尝试了什么?带引号的字符串是否总是在末尾?不,它可以在任何地方。也可能有不止一个。你能把你用来把字符串转换成大写的正则表达式吗?比如([^'”)([''“]+[^'”)+([''+[^'”)+[''”)(.*)
?您只需要使用大写字母\1
和\3
,请参见a。您可以在前两个组之间放置一个或|
,使其不带引号的字符串。
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());
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();
}