>source

나는 정규식 초보자이므로, 이것이 순진한 질문이라면 미리 사과드립니다!

쉼표로 구분 된 두 개의 값을 가진 문자열이 있습니다 : 12.345678,23.45678901

정규식을 사용하여 첫 번째 값을 소수점 3 자리로 반환하려고합니다.  소수점 2 자리 12.345 의 두 번째 값 .

이상적으로 정규 표현식 전체는 23.45 입니다.

다음 정규식을 사용하여 첫 번째 값 12.345를 얻을 수 있습니다. 12.345,23.45 .

전체 일치 만 반환하기 때문에 잘 작동합니다 (그룹 1 일치는 없음). 그러나 두 번째 값 23.45를 같은 문자열로 반환하는 방법에 대해서는 꽤 혼란스러워합니다.

이 정규식도 시도했습니다. ^\d+\.\d{0,3} 첫 번째와 두 번째 값을 올바르게 구문 분석하지만 너무 많은 소수로 전체 일치가 반환됩니다.

전체 경기 : (^.{0,6})(?:.*)(,)(.{0,5})

그룹 1 : 12.345678,23.45

그룹 2 : 12.345

그룹 3 : ,

모든 제안을 환영합니다! 미리 감사드립니다.

23.45
  • 답변 # 1

    이 정규식을 사용하여 데이터를 얻을 수 있습니다 :

    ^(\d+\.\d{3})\d*,(\d+\.\d{2})\d*$
    
    

    . 가 뒤에 오는 숫자를 찾습니다.  소수점 이하 3 자리 (처음 캡처 그룹), 숫자 뒤에 쉼표 (삭제), 숫자 뒤에 .  소수점 이하 2 자리 (두 번째 캡처 그룹), 마지막으로 몇 자릿수 및 문자열 끝 (삭제)이 이어집니다.

    PHP에서 사용하기

    $str = '12.345678,23.45678901';
    preg_match('/^(\d+\.\d{3})\d*,(\d+\.\d{2})\d*$/', $str, $matches);
    echo "first number: {$matches[1]}\nsecond number: {$matches[2]}\n";
    
    

    출력 :

    first number: 12.345 
    second number: 23.45
    
    

    3v4l.org의 데모

    $matches[0] 에서 두 경기를 모두 받아야하는 경우  배열 ( preg_match_all 사용) ),이 정규식을 사용할 수 있습니다 :

    (?<=^)\d+\.\d{3}(?=\d*,)|(?<=,)\d+\.\d{2}(?=\d*$)
    
    

    이 정규식은 다음 중 하나를 찾습니다

    문자열의 시작과 일부 숫자, .  그리고 3 자리 숫자 (일부 숫자와 쉼표가 뒤 따름);또는

    쉼표, 자릿수, .  및 2 자리 숫자 (일부 숫자 및 문자열 끝)가 표시됩니다.

    원치 않는 데이터를 캡처하지 않으려면 긍정적 인 예측과 룩백을 사용하는지 확인합니다.

    3v4l.org의 데모

관련 자료

  • 이전 javascript - 하이 스톡 스톡 도구를 추가/제거 하시겠습니까?
  • 다음 android - 리사이클 러뷰 자체의 클릭 이벤트를 시청자와 차별화하는 방법