大写所有字符,但不是引用字符串中的字符

时间:2015-12-17 07:31:44

标签: java regex

我有一个字符串,我想大写所有未引用的内容。

示例:

  

我的名字是'Angela'

结果:

  

我的名字是'Angela'

目前,我匹配每个引用的字符串,然后循环和连接以获得结果。

是否可以在一个正则表达式中实现这一点,可能使用替换?

5 个答案:

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