用符号后的长度替换字符串

时间:2018-11-25 15:32:56

标签: java

让我们以这个字符串为例:

Select * from tbl_users where age>@age and name=@name or lastname=@lastname order by @thing

我要完成的工作是用@符号后的长度替换字符串。然后删除该符号。

所以输出看起来像这样:

Select * from tbl_users where age>3 and name=4 or lastname=8 order by 5

到目前为止,我已经尝试使用正则表达式进行此操作,因此它是任何类似字符串的通用方法。但是不能完全使其发挥作用...

任何帮助,将不胜感激。

编辑:与sql /数据库无关。 此字符串只是复杂性的示例

3 个答案:

答案 0 :(得分:1)

您可以尝试使用Pattern类,

import java.util.*;
import java.util.regex.*;

public class MyClass {
    public static void main(String args[]) {
        //Your Code here
        String s = "Select * from tbl_users where age>@age and name=@name or lastname=@lastname order by @thing";
        Pattern p = Pattern.compile("@(\\S*)");
        Matcher m = p.matcher(s);
        StringBuffer bufStr = new StringBuffer();
        while (m.find()){
            Integer i =  m.group(1).length();
            m.appendReplacement(bufStr,i.toString());
        }

        String s1 = bufStr.toString();
        System.out.println(s1);
    }
}

正则表达式:@(\\S*)将匹配所有以@符号开头的非空白字符。上面代码的输出是

Select * from tbl_users where age>3 and name=4 or lastname=8 order by 5

答案 1 :(得分:0)

此:

public static String getReplace(String str, String symbol) {
    String newString = str;
    while (newString.contains(symbol)) {
        int index = newString.indexOf(symbol);
        int nextSpace = newString.indexOf(" ", index);
        if (nextSpace == -1)
            nextSpace = newString.length();
        newString = newString.substring(0, index) + (nextSpace - index - 1) + newString.substring(nextSpace);
    }
    return newString;
}

public static void main(String[] args) {
    String str = "Select * from tbl_users where age>@age and name=@name or lastname=@lastname order by @thing";
    String symbol = "@";
    str = getReplace(str, symbol);
    System.out.println(str);
}

将打印

Select * from tbl_users where age>3 and name=4 or lastname=8 order by 5

答案 2 :(得分:0)

您可以为此使用正则表达式。以下正则表达式会将所有以@符号开头的字符串进行分组,直到第一个空格或字符串结尾。

(@.*?)(?:\s|$)

此后,只需要遍历这些组并用自己的长度-1(因为@符号是该组的一部分)来替换找到的组。

private static final String regex = "(@.*?)(?:\\s|$)";
private static final Pattern pattern = Pattern.compile(regex);

private static String replaceAnnotationsWithLength(String string) {
  Matcher matcher = pattern.matcher(string);

  while (matcher.find()) {
    string = string.replace(matcher.group(1), Integer.toString(matcher.group(1).length() - 1));
  }

  return string;
}

现在打电话

replaceAnnotationsWithLength(
    "Select * from tbl_users where age>@age and name=@name or lastname=@lastname order by @thing")

将返回

Select * from tbl_users where age>3 and name=4 or lastname=8 order by 5