Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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,我有一套字符串是“5X3I3M3X” 我想分开5X=1x1x,取决于字符“X”前面的数字 所以最后它可能是1x1x1x3mi3m1x1x1x 我是这样做的 String str = "5X3I3M3X"; StringBuffer sBuffer = new StringBuffer(""); for(int i = 1 ; i < str.length() ; i=i+2) { if( str.charAt(i) == 'X'){

我有一套字符串是“5X3I3M3X”

我想分开5X=1x1x,取决于字符“X”前面的数字

所以最后它可能是1x1x1x3mi3m1x1x1x

我是这样做的

    String str = "5X3I3M3X";
    StringBuffer sBuffer = new StringBuffer("");

    for(int i = 1 ; i < str.length() ; i=i+2) {
        if( str.charAt(i) == 'X'){

            if(str.charAt(i-1) == 1){
                sBuffer.append(str.charAt(i-1)+""+str.charAt(i));
            }else{
                StringBuffer sBufferTemp = new StringBuffer("");

                for(int j=0 ; j < Character.getNumericValue(str.charAt(i-1)) ; j++){
                    sBufferTemp.append("1X");
                }

                sBuffer.append(sBufferTemp.toString());
            }
        } else {
            sBuffer.append(str.charAt(i-1)+""+str.charAt(i));
        }
    }
    System.out.println(sBuffer.toString());
String str=“5X3I3M3X”;
StringBuffer sBuffer=新的StringBuffer(“”);
对于(int i=1;i
我想知道有没有简单的方法来区分这种逻辑? 注意。如果我想添加到单独的“I”,那么它也应该像“1x1i1i3m1x1x1x”一样动态更改

如果(str.charAt(I)='I')…,我可以将其更改为我的代码extpend


我希望有另一种简单的方法来实现这一点。

您可以将可配置的字符数组传递到方法中。使用此配置,可以检查当前角色是否可展开

以下程序的输出:

1X1X1X1X1X1I1I1I1M1M1M1X1X1X
公共类StringExpander{
公共静态void main(字符串[]args){
println(扩展(“5X3I3M3X”,新字符[]{'X','I','M'});
}
公共静态字符串扩展(字符串str,char[]chArr){
StringBuffer buff=新的StringBuffer();
对于(int i=1;i
您可以将可配置字符数组传递到方法中。使用此配置,可以检查当前角色是否可展开

以下程序的输出:

1X1X1X1X1X1I1I1I1M1M1M1X1X1X
公共类StringExpander{
公共静态void main(字符串[]args){
println(扩展(“5X3I3M3X”,新字符[]{'X','I','M'});
}
公共静态字符串扩展(字符串str,char[]chArr){
StringBuffer buff=新的StringBuffer();
对于(int i=1;i
根据您的编码解决方案,我建议进行以下更改:

String str = "5X3I3M3X";
StringBuilder sBuffer = new StringBuilder();
for (int i = 0; i < str.length(); ++i) {
    if (i + 1 < str.length()
            && str.charAt(i + 1) == 'X'
            && str.charAt(i) != '1'
            && Character.isDigit(str.charAt(i))) {
        int n = Character.getNumericValue(str.charAt(i));
        for (int j = 0 ; j < n; ++j) {
            sBufferTemp.append("1X");
        }
        ++i;
    } else {
        sBuffer.append(str.charAt(i));
    }
}
String str=“5X3I3M3X”;
StringBuilder sBuffer=新的StringBuilder();
对于(int i=0;i
  • 使用更新更快的StringBuilder而不是StringBuffer
  • 循环遍历所有i,因此默认情况下的追加是直接进行的
  • 条件可以更完整,不需要对“1”进行检查
  • 必须与字符“1”进行比较,而不是与1进行比较

根据您的编码解决方案,我建议进行以下更改:

String str = "5X3I3M3X";
StringBuilder sBuffer = new StringBuilder();
for (int i = 0; i < str.length(); ++i) {
    if (i + 1 < str.length()
            && str.charAt(i + 1) == 'X'
            && str.charAt(i) != '1'
            && Character.isDigit(str.charAt(i))) {
        int n = Character.getNumericValue(str.charAt(i));
        for (int j = 0 ; j < n; ++j) {
            sBufferTemp.append("1X");
        }
        ++i;
    } else {
        sBuffer.append(str.charAt(i));
    }
}
String str=“5X3I3M3X”;
StringBuilder sBuffer=新的StringBuilder();
对于(int i=0;i
  • 使用更新更快的StringBuilder而不是StringBuffer
  • 循环遍历所有i,因此默认情况下的追加是直接进行的
  • 条件可以更完整,不需要对“1”进行检查
  • 必须与字符“1”进行比较,而不是与1进行比较

    • 我知道这完全不是语法上的甜点

      String str = "5X3I3M3X";
      char[] filter = new char[]{'X', 'I', 'M'};
      StringBuffer stringBuffer = new StringBuffer("");
      
      for (int i = 0; i < str.length(); i++) {
          if (i != 0 && new String(filter).contains(Character.toString(str.charAt(i))) && Character.isDigit(str.charAt(i-1))) {
              for (int j = 0; j < Character.getNumericValue(str.charAt(i-1)); j++) {
                  stringBuffer.append("1" + str.charAt(i));
              }
          } else if (i < str.length()-1 && new String(filter).contains(Character.toString(str.charAt(i+1)))) {
              //do nothing
          }
          else {
              stringBuffer.append(str.charAt(i));
          }
      }
      
      String str=“5X3I3M3X”;
      char[]filter=new char[]{'X',