确定string是否可以转换为int数组

时间:2014-01-07 16:54:00

标签: java regex

我有一个将int数组转换为String的转换器。

**EDIT** [1, 2, -45, 678] -> "1 2 -45 678";
[1] -> "1"

在这个转换器中,我有一个supportFromString方法来识别字符串是否可以转换回数组。

我虽然使用正则表达式这样做,但我找不到一个好的匹配。 我尝试了"\\d+\\s""[\\d+]\\s",但s.matches(pattern)返回false。

有什么建议吗?如果找到一个非数字字符,则它无效。

修改 这是转换器的toString方法

@Override
public String toString(Object o, ConverterContext converterContext) {
    StringBuilder builder = new StringBuilder();

    for (Integer integer : ((Integer[]) o)) {
        if (builder.toString().length() > 0) {
            builder.append(" ");
        }

        builder.append(integer);
    }

    return builder.toString();
}

6 个答案:

答案 0 :(得分:2)

我会针对以下正则表达式测试字符串:

[^\d ]

如果您得到任何结果,则表示您拥有除数字(\ d)或空格

之外的其他内容

答案 1 :(得分:1)

试试这段代码:

String pattern = "(-?\\d+\\s*)+";
String test = "1 -5 2 45 678";

System.out.println(test.matches(pattern));

<强>输出

  

如果要查找数字,请单独使用此模式:-?\\d+\\s*

答案 2 :(得分:1)

static Pattern validPattern = Pattern.compile("^(\\-{0,1}\\d+\\s)*(\\-){0,1}\\d+$");

public static void main(String[] args) {
    isStringValid("1 2 3 4 5");
    isStringValid("1 26 35 44 53");
    isStringValid("1 2a 3s 4 5");
    isStringValid("1234");
    isStringValid("1");
    isStringValid("1 ");
    isStringValid("a b c");
    isStringValid("1 b c");
    isStringValid("1 1 2 33333");
    isStringValid("-1 1 2 33333");
    isStringValid("1 1 2 -33333");
    isStringValid("1 1 2 ----33333");
    isStringValid("---1 1 2 -33333");
}

public static boolean isStringValid(String s){
    s = s.trim();
    boolean b = validPattern.matcher(s).find();

    if (b){
        System.out.printf("%s: is valid.\n", s);
    }else{
        System.out.printf("%s: is NOT valid.\n", s);
    }

    return(b);
}

结果:

1 2 3 4 5: is valid.
1 26 35 44 53: is valid.
1 2a 3s 4 5: is NOT valid.
1234: is valid.
1: is valid.
1: is valid.
a b c: is NOT valid.
1 b c: is NOT valid.
1 1 2 33333: is valid.
-1 1 2 33333: is valid.    
1 1 2 -33333: is valid.
1 1 2 ----33333: is NOT valid.
---1 1 2 -33333: is NOT valid.

答案 3 :(得分:0)

这是你可以用来测试字符串是否是一个数字的正则表达式,可选地后跟一个或多个空格分隔的其他数字:

"(0|-?[1-9][0-9]*)(\\s+(0|-?[1-9][0-9]*))*"

编辑:包含负整数并排除前导零。

答案 4 :(得分:0)

这是我的处理,处理负数。

   import  java.util.regex.Matcher;
   import  java.util.regex.Pattern;
   import  java.util.Arrays;
/**
   <P>java IntArrayToStringToIntArray</P>
 **/
public class IntArrayToStringToIntArray  {
   private static final Pattern pDigits = Pattern.compile("-?\\d+");
   public static final void main(String[] igno_red)  {

      String sArray = Arrays.toString(new int[]{1, 2, -45, 678});
         System.out.println("---The array: " + sArray);
         System.out.println(isSafeToConvertToStringedArrayToIntArray(sArray));
         int[] ai = getIntArrayFromToStringedArray(sArray);
         for(int i : ai)  {
            System.out.println(i);
         }
         System.out.println();

      sArray = Arrays.toString(new int[]{1});
         System.out.println("---The array: " + sArray);
         System.out.println(isSafeToConvertToStringedArrayToIntArray(sArray));
         ai = getIntArrayFromToStringedArray(sArray);
         for(int i : ai)  {
            System.out.println(i);
         }
         System.out.println();

      sArray = "bogus";
         System.out.println("---The array: " + sArray);
         System.out.println(isSafeToConvertToStringedArrayToIntArray(sArray));
   }


   //Assumes the string is formatted as if by Arrays.toString(int[])
   public static final boolean isSafeToConvertToStringedArrayToIntArray(String s_ofInts)  {
      //Eliminate the surrounding square brackets
      s_ofInts = s_ofInts.substring(1, s_ofInts.length() - 1);
      String[] as = s_ofInts.split(", ");

      for(String s : as)  {
         Matcher m = pDigits.matcher(s);
         if(!m.matches())  {
            return  false;
         }
      }

      return  true;
   }


   //Assumes the string is formatted as if by Arrays.toString(int[])
   public static final int[] getIntArrayFromToStringedArray(String s_ofInts)  {
      //Eliminate the surrounding square brackets
      s_ofInts = s_ofInts.substring(1, s_ofInts.length() - 1);

      String[] as = s_ofInts.split(", ");

      int[] ai = new int[as.length];
      for(int i = 0; i < as.length; i++)  {
         String s = as[i];
         Matcher m = pDigits.matcher(s);
         if(m.matches())  {
            ai[i] = Integer.parseInt(s);
         }  else  {
            throw  new IllegalArgumentException("getIntArrayFromToStringedArray: Element " + i + " in s_ofInts is not an int: \"" + s + "\".");
         }
      }
      return  ai;
   }
}

答案 5 :(得分:-1)

你可以从扫描器读取整个输入行,然后拆分行,然后你有一个String [],将每个数字解析为int [],索引一对一匹配(假设有效输入,没有NumberFormatExceptions),如< br /> String line = scanner.nextLine();
String [] numberStrs = line.split(“,”);
int [] numbers = new int [numberStrs.length];
for(int i = 0; i&lt; numberStrs.length; i ++)
{
numbers [i] = Integer.parseInt(numberStrs [i]);
}