java正则表达式捕获2个数字

时间:2017-10-05 19:32:24

标签: java regex capture-group

我正在寻找捕捉年份和字符串最后一个数字的方法。例如:“01/02 / 2017,546.12,24.2,”我的问题到目前为止我只找到了价值:2017年,发现价值:无效。我无法抓住小组(2)。谢谢

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Scanner;


public class Bourse {

    public static void main( String args[] ) {
        Scanner clavier = new Scanner(System.in);

        // String to be scanned to find the pattern.
        String line = clavier.nextLine();
        String pattern = "(?<=\\/)(\\d{4})|(\\d+(?:\\.\\d{1,2}))(?=,$)";

        // Create a Pattern object
        Pattern r = Pattern.compile(pattern);

        // Now create matcher object.
        Matcher m = r.matcher(line);

        if (m.find( )) {
            System.out.println("Found value: " + m.group(1) );
            System.out.println("Found value: " + m.group(2) );
        } else {
            System.out.println("NO MATCH");
        }
    }
}

3 个答案:

答案 0 :(得分:1)

试试这个:

(\\d{2}\\.?\\d{2})
  • \\d{2} - 正好两位数
  • \\.? - 可选点
  • \\d{2} - 正好两位数

如果我理解你正确,你正在寻找4位数字,可以用点分隔。

答案 1 :(得分:0)

您的要求不是很清楚,但这对我来说只需抓住年份和最后一个小数值:

Pattern pattern = Pattern.compile("[0-9]{2}/[0-9]{2}/([0-9]{4}),[^,]+,([0-9.]+),");
String text = "01/02/2017,546.12,24.2,";
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
    String year = matcher.group(1);
    String lastDecimal = matcher.group(2);
    System.out.println("Year "+year+"; decimal "+lastDecimal);
}

我不知道你是否故意使用lookbehind和lookahead,但我认为明确指定完整日期模式并使用两个显式逗号字符之间的值更为简单。 (显然,如果你需要逗号继续使用,你可以用一个先行替换最后一个逗号。)

顺便说一句,我不是\d速记的粉丝,因为在许多语言中,这将匹配整个Unicode字符空间中的所有数字字符,而通常只需匹配ASCII数字0-9 。 (当使用\d时,Java只匹配ASCII数字,但我仍然认为这是一个坏习惯。)

答案 2 :(得分:0)

解析,而不是正则表达式

Regex在这里太过分了。

只需将字符串拆分为逗号 - delimiter即可。

String input = "01/02/2017,546.12,24.2,";
String[] parts = input.split( "," );

将每个元素解析为有意义的对象,而不是将所有内容都视为文本。

对于仅限日期的值,现代方法使用Java 8及更高版本中内置的java.time.LocalDate类。

// Parse the first element, a date-only value.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate localDate = null;
String inputDate =  parts[ 0 ] ;
try
{
   localDate =  LocalDate.parse( inputDate , f );
} catch ( DateTimeException e )
{
    System.out.println( "ERROR - invalid input for LocalDate: " + parts[ 0 ] );
}

对于精度很重要的带小数的数字,请避免使用浮点类型,而是使用BigDecimal。鉴于您的班级名称“证券交易所”,我认为这些数字与金钱有关,因此准确性很重要。始终使用BigDecimal来解决金钱问题。

// Loop the numbers
List < BigDecimal > numbers = new ArrayList <>( parts.length );
for ( int i = 1 ; i < parts.length ; i++ )
{  // Start index at 1, skipping over the first element (the date) at index 0.
    String s = parts[ i ];
    if ( null == s )
    {
        continue;
    }
    if ( s.isEmpty( ) )
    {
        continue;
    }
    BigDecimal bigDecimal = new BigDecimal( parts[ i ] );
    numbers.add( bigDecimal );
}

提取您需要的两条信息:年份和最后一个数字。

考虑在代码中传递Year对象而不是仅仅表示年份的整数。这为您提供了类型安全性,使您的代码更加自我记录。

// Goals: (1) Get the year of the date. (2) Get the last number.
Year year = Year.from( localDate );  // Where possible, use an object rather than a mere integer to represent the year.
int y = localDate.getYear( );
BigDecimal lastNumber = numbers.get( numbers.size( ) - 1 );  // Fetch last element from the List.

转储到控制台。

System.out.println("input: " + input );
System.out.println("year.toString(): " + year );
System.out.println("lastNumber.toString(): " + lastNumber );

请参阅此code run live at IdeOne.com

  

输入:01/02 / 2017,546.12,24.2,

     

year.toString():2017

     

lastNumber.toString():24.2