문자열에서 가장 긴 숫자를 인쇄하는 방법은 무엇입니까?

문자열에서 가장 긴 숫자를 인쇄하는 방법은 무엇입니까?

문자열에서 가장 긴 숫자를 인쇄하는 방법을 찾고 있습니다.

예: 문자열이 있는 경우

212334123434test233

어떻게 인쇄할 수 있어?

212334123434

?

참고: 수치적으로 더 높은 값이 아닌 가장 긴 연속 숫자 시퀀스를 찾고 있습니다.


편집하다:답변해 주셔서 감사합니다. 이 질문에 대한 반응은 매우 뜨거웠습니다. @HaukeLaging의 게시물이 내 특정 상황에 매우 잘 맞기 때문에 허용되는 답변으로 표시하고 있지만 모든 답변이 동일하게 유효하다는 점을 지적하고 싶습니다. 문제를 해결하기 위해 몇 가지 다른 옵션을 갖는 것은 항상 좋은 일입니다.

답변1

나는 당신이 grep, , 로도 sort이것을 할 수 있다고 믿습니다 tail. 다음은 몇 가지 예시 문자열입니다.

$ echo <str> | grep -oP "\d+" | sort -n | tail -1

<str>우리 문자열에 문제가 있는 곳이 어디입니까?

$ set -o posix; set | grep "str[0-9]"
str0=212334123434test233
str1=212334123434test233abc44
str2=233test212334123434
str3=a212334123434test233abc44
str4=a91234b212334123434abc

이제 grep ...명령을 통해 이를 순서대로 실행하면 됩니다.

$ echo $str0 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str1 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str2 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str3 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str4 | grep -oP "\d+" | sort -n | tail -1
212334123434

이 방법은 일련의 숫자 중 모든 하위 문자열을 선택하여 작동합니다. 그런 다음 출력을 숫자순으로 정렬 sort -n하고 를 사용하여 목록의 마지막 값을 가져옵니다 tail -1. 이는 가장 긴 하위 문자열이 됩니다.

tail -1예제 중 하나를 닫고 다시 실행하면 어떻게 작동하는지 확인할 수 있습니다.

$ echo $str4 | grep -oP "\d+" | sort -n
91234
212334123434

0으로 시작하는 문자열

위의 방법은 한 가지를 제외하고 내가 생각할 수 있는 모든 경우에 작동합니다.@terdon이 채팅에서 언급했습니다.이 상황은 위의 접근 방식을 무효화합니다.

  • 0000000000001
  • 2

따라서 이 문제를 해결하려면 전략을 조금 바꿔야 합니다. 위 방법의 핵심은 여전히 ​​악용될 수 있지만 결과에 문자 수를 삽입해야 합니다. 이를 통해 문자열의 문자 수와 해당 값을 기준으로 결과를 정렬할 수 있습니다.

$ for i in $(echo $str0 | grep -oP "\d+");do a=$(echo "$i" | wc -c); \
    echo "$a $i"; done | sort -n | tail -1 | cut -d" " -f2

결과:

$ echo $str0
0000000000001a2test

$ for i in $(echo $str0 | grep -oP "\d+");do a=$(echo "$i" | wc -c); \
    echo "$a $i"; done | sort -n | tail -1 | cut -d" " -f2
0000000000001

변수의 길이를 결정하는 Bash의 기능을 활용하여 압축할 수 있습니다 ${#var}.

$ for i in $(echo $str0 | grep -oP "\d+");do echo "${#i} $i"; done | \
    sort -n | tail -1 | cut -d" " -f2
0000000000001

`grep -P를 사용하세요.

grep -P ...나는 Perl 개발자로서 모든 숫자를 또는 \d+대신 , 와 같이 표현하는 클래스 구문을 좋아하기 때문에 위의 접근 방식을 사용하기로 결정했습니다 . 하지만 이 특정 문제의 경우에는 실제로 필요하지 않습니다. 내가 사용한 것을 다음과 같이 쉽게 교체할 수 있습니다 .[[:digit:]]\+[0-9]\+grep

$ .... grep -o "[0-9]\+" ....

예를 들어:

$ for i in $(echo $str0 | grep -o "[0-9]\+");do echo "${#i} $i"; done | \
    sort -n | tail -1 | cut -d" " -f2
0000000000001

답변2

해결책 perl:

echo 212334123434test233abc44 |
perl -nle 'print ((
    map { $_->[0] }
    sort{ $a->[1] <=> $b->[1] }
    map { [$_,length] }
    split /\D+/, $_)[-1]
    )'
212334123434

인용하다

답변3

echo 212334123434test233abc44 | 
awk '{gsub("[^0-9]+","\n"); print;}' | 
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } 
  END { print maxline }'

212334123434

답변4

소수와 정수를 처리할 수 있는 또 다른 Perl 메서드는 다음과 같습니다.

echo "0.212334123434test233" | 
 perl -lne 'while(/([\d.]+)/g){$max=$1 if length($1) > length($max)} print $max'

지금까지 게시된 답변 중 소수를 처리하는 답변은 없으며 수치상 가장 큰 숫자가 아닌 가장 긴 숫자를 원한다고 지정했기 때문에 실제로필요소수점.

설명하다

  • perl -lne: -n"입력을 한 줄씩 읽고 -e그에 대해 주어진 스크립트를 실행한다"는 의미입니다. 각 호출에 -l줄바꿈을 추가합니다 print(여기서 관련되지 않은 다른 항목도 포함).
  • while(/([\d.]+)/g): 모든 숫자에 대해 반복합니다( 즉, 숫자의 합이 일치함을 의미) \d. 음수도 찾으려면 다음 단계에서 사용할 일치하는 문자열을 추가하세요 .[0-9][\d.].-$1
  • $max=$1 if length($1) > length($max): 현재 일치 항목의 길이가 지금까지 가장 긴 것( $max)보다 긴 경우 일치 항목을 로 저장합니다 $max.
  • print $max:발견된 가장 긴 숫자 문자열을 인쇄합니다. 이것이 실행될 것이다뒤쪽에while 루프가 종료되므로 모든 숫자를 찾은 후입니다.

관련 정보