문제

나는 버전 번호를 다음과 같은 형식으로 제공합니다.

버전입니다.릴리스입니다.정

치 버전을 출시하고 수정하는 어느 집의 숫자 또는'*'와일드카드 문자입니다.또한,이러한 숫자는(그리고 그 앞에 있는.) 지 않을 수 있습니다.

그래서 다음과 같은 유효과로 구문 분석:

1.23.456 = version 1, release 23, modification 456
1.23     = version 1, release 23, any modification
1.23.*   = version 1, release 23, any modification
1.*      = version 1, any release, any modification
1        = version 1, any release, any modification
*        = any version, any release, any modification

그러나 이들은 유효하지 않습니다.

*.12
*123.1
12*
12.*.34

할 수 있는 사람이 제공되지 않 너무 복잡한 정규 표현식을 확인하고 검색 버 및 수정 번호?

도움이 되었습니까?

해결책

나를 표현 형식이다:

"1-3 점으로 분리된 부품,각각의 숫자를 제외하고는 마지막이 될 수 있*"

로 regexp 는:

^(\d+\.)?(\d+\.)?(\*|\d+)$

[편집을 추가합니다:이 솔루션은 간단한 방법은 유효성을 검사하지만,그것은이 지적되는 추출 값을 추가 작업이 필요.그것은 맛의 문제 여부는 이 처리하여 복잡하게 정규 표현식,또는 처리하여 일치하는 그룹이다.

에 나 솔루션 그룹을 캡처 "." 자입니다.이를 사용하여 처리 비 캡처 그룹으로서 ajborley 의 대답이다.

또한,오른쪽 그룹 캡쳐 마지막 구성요소,심지어 보다 적은 경우 세 가지 구성요소,그래서 예를 들어,두 개의 구성 요소를 입력한 결과에 첫 번째와 마지막 그룹을 캡처하고 중 하나는 정의되지 않습니다.나는 생각이 다룰 수 있는 비 욕심 그룹이 지원됩니다.

펄 코드를 모두 처리한 후에 문제 regexp 무언가가 될 수 있습 다음과 같다:

@version = ();
@groups = ($1, $2, $3);
foreach (@groups) {
    next if !defined;
    s/\.//;
    push @version, $_;
}
($major, $minor, $mod) = (@version, "*", "*");

지 않는 정말 어떤 것보다 짧은 분할에 "." ]

다른 팁

사용 regex 그리고 지금 당신은 두 가지 문제가 발생합니다. 분 것에 점("."), 다음 사항을 확인하십시오 각 부분 중 하나는 와일드카드 또는 일련의 숫자(정규식이 완벽한 지금).는 경우에는 것은 유효합니다,당신은 그냥 돌아 올바른의 덩어리할 수 있다.

이 작동 수 있습니다:

^(\*|\d+(\.\d+){0,2}(\.\*)?)$

최상위 수준에"*"특별한 케이스의 유효한 버전 번호입니다.그렇지 않으면 바로 시작합니다.그런 다음 거기에 제로,하나 또는 두".nn"시퀀스는,다음에 의해 선택".*".이 regex 것을 받아들 1.2.3.* 수도 있습니다 또는 허용되지 않습니다.

검색하는 코드는 일치된 시퀀스,특히 (\.\d+){0,2} 부분에 따라 달라집니다 당신의 특별한 정규 표현식 라이브러리입니다.

모든 주셔서 감사합니다.이 ace:)

에 따라 OneByOne 의 답변(보이는 가장 간단한 나),나도 추가 비 캡처 그룹(이하'(?:' 부품-감사 VonC 저를 소개하는 비 캡처 그룹!), 그래서 그룹을 캡처 할만 포함 숫자*문자입니다.

^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$

많은 주셔서 감사합니다 모두가!

몰라 어떤 플랫폼에 있지만.NET 있는 시스템입니다.버스는 분석됩니다"n.n n n"버전 번호는 당신입니다.

제 2 센트:나는 이 시나리오:을 분석 버전 숫자의 문자열이다.(나는 알고 이것은 매우 다양에서는 원래 질문,하지만 인터넷 검색을 찾 regex 에 대한 구문 분석 버전 번호는 보이 스레드에서 최고,그렇게 추가하는 이 대답을 여기)

그래서 이 문자열 리터럴 것 같은 것:"서비스 버전 1.2.35.564 실행!"

했을 분석하 1.2.35.564 이낸다.방에서 큐@ajborley,내 regex 은 다음과 같습니다:

(?:(\d+)\.)?(?:(\d+)\.)?(?:(\d+)\.\d+)

작은 C#을 조각 이를 테스트하는 다음과 같이 말입니다.

void Main()
{
    Regex regEx = new Regex(@"(?:(\d+)\.)?(?:(\d+)\.)?(?:(\d+)\.\d+)", RegexOptions.Compiled);

    Match version = regEx.Match("The Service SuperService 2.1.309.0) is Running!");
    version.Value.Dump("Version using RegEx");   // Prints 2.1.309.0        
}

가 동의하는 경향으로 분할 제안이 있습니다.

Ive 만들어"검사자는"당신의 문제에 대한 perl

#!/usr/bin/perl -w


@strings = ( "1.2.3", "1.2.*", "1.*","*" );

%regexp = ( svrist => qr/(?:(\d+)\.(\d+)\.(\d+)|(\d+)\.(\d+)|(\d+))?(?:\.\*)?/,
            onebyone => qr/^(\d+\.)?(\d+\.)?(\*|\d+)$/,
            greg => qr/^(\*|\d+(\.\d+){0,2}(\.\*)?)$/,
            vonc => qr/^((?:\d+(?!\.\*)\.)+)(\d+)?(\.\*)?$|^(\d+)\.\*$|^(\*|\d+)$/,
            ajb => qr/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/,
            jrudolph => qr/^(((\d+)\.)?(\d+)\.)?(\d+|\*)$/
          );

  foreach my $r (keys %regexp){
    my $reg = $regexp{$r};
    print "Using $r regexp\n";
foreach my $s (@strings){
  print "$s : ";

    if ($s =~m/$reg/){
    my ($main, $maj, $min,$rev,$ex1,$ex2,$ex3) = ("any","any","any","any","any","any","any");
    $main = $1 if ($1 && $1 ne "*") ;
    $maj = $2 if ($2 && $2 ne "*") ;
    $min = $3 if ($3 && $3 ne "*") ;
    $rev = $4 if ($4 && $4 ne "*") ;
    $ex1 = $5 if ($5 && $5 ne "*") ;
    $ex2 = $6 if ($6 && $6 ne "*") ;
    $ex3 = $7 if ($7 && $7 ne "*") ;
    print "$main $maj $min $rev $ex1 $ex2 $ex3\n";

  }else{
  print " nomatch\n";
  }
  }
print "------------------------\n";
}

현재 출력:

> perl regex.pl
Using onebyone regexp
1.2.3 : 1. 2. 3 any any any any
1.2.* : 1. 2. any any any any any
1.* : 1. any any any any any any
* : any any any any any any any
------------------------
Using svrist regexp
1.2.3 : 1 2 3 any any any any
1.2.* : any any any 1 2 any any
1.* : any any any any any 1 any
* : any any any any any any any
------------------------
Using vonc regexp
1.2.3 : 1.2. 3 any any any any any
1.2.* : 1. 2 .* any any any any
1.* : any any any 1 any any any
* : any any any any any any any
------------------------
Using ajb regexp
1.2.3 : 1 2 3 any any any any
1.2.* : 1 2 any any any any any
1.* : 1 any any any any any any
* : any any any any any any any
------------------------
Using jrudolph regexp
1.2.3 : 1.2. 1. 1 2 3 any any
1.2.* : 1.2. 1. 1 2 any any any
1.* : 1. any any 1 any any any
* : any any any any any any any
------------------------
Using greg regexp
1.2.3 : 1.2.3 .3 any any any any any
1.2.* : 1.2.* .2 .* any any any any
1.* : 1.* any .* any any any any
* : any any any any any any any
------------------------

이 일을 위해 당신이 무엇을 규정.그것은 경첩에 와일드 카드의 위치와 이 중첩된 regex:

^((\*)|([0-9]+(\.((\*)|([0-9]+(\.((\*)|([0-9]+)))?)))?))$

http://imgur.com/3E492.png

나의 답변을,하지만...나는 새로운 하나입니다.그것이 나를 위해 적어도 있습니다.추가로 새로운 제한이 있습니다.버전 번호를 시작할 수 없습니다(주소 또는 패치)모든 제로에 따라 다른 사람에 의해.

01.0.0 유효하지 않은 1.0.0 가 유효한 10.0.10 가 유효한 1.0.0000 유효하지 않은

^(?:(0\\.|([1-9]+\\d*)\\.))+(?:(0\\.|([1-9]+\\d*)\\.))+((0|([1-9]+\\d*)))$

그것을 기반으로 이전에 하나입니다.그러나 나는 이 솔루션은 더 나은...나;)

즐길 수 있습니다!

다른 시도 하:

^(((\d+)\.)?(\d+)\.)?(\d+|\*)$

이렇게 세 부분에서 그룹 4,5,6 만:그들은 오른쪽으로 정렬되어 표시됩니다.그래서 첫 번째 null 이 아닌 하나의 4,5 6 버전을 제공합 분야이다.

  • 1.2.3 제공 1,2,3
  • 1.2.* 제공 1,2,*
  • 1.2 을 제공합 null,1,2
  • ***을 제공합 null,null*
  • 1.* 제공 null,1,*
^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$

아마도 더 간결하고 중 하나가 될 수 있습니다:

^(?:(\d+)\.){0,2}(\*|\d+)$

이할 수 있습 향상 1.2.3.4.5.* 또는 제한을 정확하게 X.Y.Z*를 사용하거나{2}대신{0,2}

나 요구하여 검색/일치에 대한 버전 번호는 다음과 같이븐 컨벤션 또는 심지어는 단 하나의 숫자입니다.하지만 예선 어떤 경우에도 빠지지 않았습니다.그것은 독특한,그것은 내게 시간을 내놓았다 다음이:

'^[0-9][0-9.]*$'

이 버전

  1. 시작으로 자리
  2. 의 수자리
  3. 숫자만'.'은 허용

하나의 단점은 버전을 할 수 있도로 끝나'.' 하지만 그것은 처리할 수 있는 무기한 길이의 버전(미친 버전 관리는 경우에 당신은 그것을 부르고 싶)

경기:

  • 1.2.3
  • 1.09.5
  • 3.4.4.5.7.8.8.
  • 23.6.209.234.3

하지 않은 경우 불행'.'종료 될 수있다,당신이 결합할 수 있습 endswith 로직

(?ms)^((?:\d+(?!\.\*)\.)+)(\d+)?(\.\*)?$|^(\d+)\.\*$|^(\*|\d+)$

는 정확하게 일치의 6 번째 예로,그리고 거부하는 다른 4

  • 그룹 1:주요거나요.미성년자 또는'*'
  • 그룹 2 존재하는 경우:미성년자 또는*
  • 그룹 3 존재하는 경우:*

를 제거할 수 있습'(?ms)'
내가 사용하는 그것을 나타내는 이 regexp 에 적용될 멀티-라인을 통해 QuickRex

이 경기 1.2.3.* 도

^(*|\d+(.\d+){0,2}(.*)?)$

나는 제안이 덜한:

(*|\d+(.\d+)?(.*)?)|\d+.\d+.\d+)

Keep in mind regexp 은 욕심,그래서 당신은 단지 내에서 검색하는 버전 번호 문자열에는 더 큰 텍스트,사용하^및$표시하는 시작과 끝의의 문자열입니다.Regexp 에서 그 잘 동작하는 것 같다(다만 그것 빠른 시에서 내 편집기),그에 따라 당신의 라이브러리/언어 첫 번째 부분은 여전히 일치"*"내 잘못된 버전 숫자입니다.어쩌면 내가 누가 나를 사용하지 않은 기능을 위해 또는 그래서.

이해할 수 있는지 확인을 찾아 올바른 버전 번호:

^(\*|\d+(\.\d+)*(\.\*)?)$

편집:실제로 그들을 추가 이미 고도 향상의 솔루션을 나는 너무 느:)

그것은 것을 가지고 열심히 regex 는 정확하게 당신이 원하는 무엇을(즉만 받아들이는 경우는 당신이 필요하고 거부 모든 다른 사람 일부를 반환에 대한 그룹의 세 가지 구성요소).나는 그것을 시도하고 함께 올:

^(\*|(\d+(\.(\d+(\.(\d+|\*))?|\*))?))$

IMO(지 광범위하게 테스트)이 잘 작동으로 검증을 위해 입력,하지만 문제는 이 정규 표현식을 제공하지 않는 방법의 검색 컴포넌트를 개발할 수 있습니다.에 대해 당신은 여전히 해야 할지에 대한 분할 기간.

이 솔루션은 없습 all-in-one 지만,대부분의 시간을 프로그래밍에 그것이 필요하지 않습니다.물론 이에 따라 달라집 다른 제한을 수도 있습니다.

지정 XSD 요소:

<xs:simpleType>
    <xs:restriction base="xs:string">
        <xs:pattern value="[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(\..*)?"/>
    </xs:restriction>
</xs:simpleType>

나이로,좋은 운동- vparse, 가 작은 소스, 으로,단순한 기능:

function parseVersion(v) {
    var m = v.match(/\d*\.|\d+/g) || [];
    v = {
        major: +m[0] || 0,
        minor: +m[1] || 0,
        patch: +m[2] || 0,
        build: +m[3] || 0
    };
    v.isEmpty = !v.major && !v.minor && !v.patch && !v.build;
    v.parsed = [v.major, v.minor, v.patch, v.build];
    v.text = v.parsed.join('.');
    return v;
}

중 하나 이상의 솔루션:

^[1-9][\d]*(.[1-9][\d]*)*(.\*)?|\*$
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top