有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java用逗号分隔数据

我在学RegEx。完全是个新手:P

我想从下面的数据中分离数字,这些数据仅用逗号分隔

test
t,b
45,49
31,34,38,34,56,23,,,,3,23,23653,3875,3.7,8.5,2.5,7.8,2., 6 6 6 6 ,
,
.
.,/;,jm.m.,,n ,sdsd, 3,2m54,2 4,2m,ar ,SSD A,,B,4D,CE,S4,D,2343ES,SD

假设我从表单文本字段获取上述数据。现在我只想读取数据,数据是用逗号分隔的数字

解决方案应为[字符串]

45,49,31,34,38,34,56,23,3,23,23653,3875

应跳过所有其他数据。 我试过这样的^[0-9]+\$

但它也从3.7中选择7,从8.5中选择5,等等

谁能帮我解决这个问题


共 (3) 个答案

  1. # 1 楼答案

    此体验将为您提供所需的所有数字(仅数字,无逗号)

    "^\d+|(?<=,)\d+$|(?<=,)\d+(?=,)"
    

    请参见grep示例:

    kent$  echo "31,34,38,34,56,23,,,,3,23,23653,3875,3.7,8.5,2.5,7.8,2., 6 6 6 6 ,
    "|grep -oP "^\d+|(?<=,)\d+$|(?<=,)\d+(?=,)"
    
    31
    34
    38
    34
    56
    23
    3
    23
    23653
    3875
    
  2. # 2 楼答案

    假设已经在逗号处拆分,并尝试检查得到的元素是否为数字,请使用以下表达式:^\d+(?:\.\d+)?$,这意味着:“必须以数字开头,后面可能跟一个点,并且至少还有一个数字”

    这将匹配317.8,但不匹配2.6 6 6 62m54

    下面是对该表达式的部分解释:

    • ^表示:匹配必须从第一个字符开始
    • $意味着:匹配必须在最后一个字符处结束,因此两者一起意味着整个字符串必须匹配
    • \d+表示:一个或多个数字
    • (?: ... )是一个非捕获组,允许应用?量词
    • \.表示:文字点
    • (?:\.\d+)?因此意味着:一个点的零或一次出现,后跟至少一个数字

    编辑:如果您只需要整数,只需删除组:^\d+$->;整个输入必须是一个或多个数字

    编辑2:如果可以在输入字符串前加逗号(请参见编辑4),则应该能够使用此正则表达式获取所有数字:(?<=,)\s*(\d+(?:\.\d+)?)\s*(?=,)(仅整数需要删除(?:\.\d+)?部分)

    该表达式获取两个逗号之间的所有数字,逗号和数字之间可能有空格,并将数字捕获到一个组中。这将阻止6 6 6 62m54的匹配。然后只需迭代匹配就可以得到所有组

    编辑3:下面是一个输入字符串的示例

    String input = "test\n" +
            "t,b\n" +
            "45,49\n" +
            "31,34,38,34,56,23,,,,3,23,23653,3875,3.7,8.5,2.5,7.8,2., 6 6 6 6 ,\n" +
            ",\n" +
            ".\n" +
            ".,/;,jm.m.,,n ,sdsd, 3,2m54,2 4,2m,ar ,SSD A,,B,4D,CE,S4,D,2343ES,SD\n";
    
    Pattern p = Pattern.compile( "(?<=,|\\n)\\s*(\\d+(?:\\.\\d+)?)\\s*(?=,|\\n)" );    
    
    Matcher m = p.matcher( input );
    
    List<String> numbers = new ArrayList<String>();
    
    while(m.find())
    {
      numbers.add( m.group( 1 ) );
    }
    
    System.out.println(Arrays.toString( numbers.toArray() ));
    
    //prints: [45, 49, 31, 34, 38, 34, 56, 23, 3, 23, 23653, 3875, 3.7, 8.5, 2.5, 7.8, 3]
    //removing the faction group: [45, 49, 31, 34, 38, 34, 56, 23, 3, 23, 23653, 3875, 3]
    

    编辑4:实际上,您不需要添加逗号,只需使用以下表达式:

    `(?<=,|\n|^)\s*(\d+)\s*(?=,|\n|$)`
    

    开始和结束处的组表示匹配必须紧跟输入的开始、逗号或换行符,然后紧跟输入的结束、逗号或换行符

  3. # 3 楼答案

    我能想到的最短解决方案是用空字符串替换任何不是由逗号分隔的数字集的内容。所以你可以做s.replaceAll("[^0-9]*,", ",")如果你有随机的换行符,你可能会想添加一个s.replaceAll("\n", ",")。然后在这些转换之后,您可以按照建议进行操作,并使用逗号进行拆分