Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 大写所有字符,但不包括带引号字符串中的字符_Java_Regex - Fatal编程技术网

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();
}