Derek Park
그는 물었다 12년 전
2

Regex 속성이 Perl 로 구문 분석

39 의 I 에 실행했음 here& 문제가 있다. 나는 형태의 속성뿐 문장열

"x=1 and y=abc and z=c4g and ..."

하지만 이런 특성은 일부 숫자 값을 날짜 등 일부 업체는 알파 값뿐만 혼합됨, 일부 업체는.

, 해야 한다 '는 모든 문자열을 &quot 아노테르발', y = x = 섬발 &quot. 그러나 일부 don& # 39, 처음에는 없다. 나는 내가 해야 할 일은 다음 세 가지.

  1. 'X' 와 'y' 특정 문장열 검증하십시오 수 있습니다.
  2. 실제로 'x' 와 'y' 의 값을 구문 분석.
  3. 나머지 내려받습니다 구체화하십시오.

맨 위에 다음과 같은 예를 볼 때 이는 결과적으로 com/go/4e6b330a_kr:

$x = 1;
$y = "abc";
$remainder = "z=c4g and ..."

내 질문은: 검증하십시오 간단하게 분석할 수 있나요 (합리적으로) 이 한 번의 정규식이? 예:

if ($str =~ /someexpression/)
{
    $x = $1;
    $y = $2;
    $remainder = $3;
}

참고로, 'x' 와 'y' 속성뿐 만 구체화하십시오 구성될 수 있습니다. 이는 유효함 구체화하십시오.

39 라고 하지만, ll 게시물로의 내 솔루션이므로 i& 표시됨과 doesn& # 39, t 충족합니다 단일 regex 기본.

답변 5 개

또한 다른 일을 할 때 함께 name = value 쌍으로 this is how I would do it (버전 사용하여 펄 5.10):

use 5.10.0;
use strict;
use warnings;

my %hash;
while(
    $string =~ m{
       (?: ^ | \G )    # start of string or previous match
       \s*

       (?<key>   \w+ ) # word characters
       =
       (?<value> \S+ ) # non spaces

       \s*             # get to the start of the next match
       (?: and )?
    }xgi
){
    $hash{$+{key}} = $+{value};
}

# to make sure that x & y exist
die unless exists $hash{x} and exists $hash{y};

Tfsnap 펄 (perl)) 에 (최소한 펄 (perl) 의 5.6).

use strict;
use warnings;

my %hash;
while(
    $string =~ m{
       (?: ^ | \G )   # start of string or previous match
       \s*

       ( \w+ ) = ( \S+ )

       \s*            # get to the start of the next match
       (?: and )?
    }xgi
){
    $hash{$1} = $2;
}

# to make sure that x & y exist
die unless exists $hash{x} and exists $hash{y};

이러한 계속 작업을 할 경우 더 많은 데이터를 사용할 수 있다는 이점도 있다.

Brad Gilbert
Ben Deutsch
그는 8년 전 댓글을 달았습니다
0

+1 좋은 예로는 버퍼 캡처하기 release.!

Casimir et Hippolyte
그는 4년 전 댓글을 달았습니다
0

'이미' \G 시작할 수 있도록 일치시킵니다 문자열이어야 \G 굈 ' (\G?: ^)' 을 (를) ''. 하지만 더 좋은 방법은 처음부터 '와' 및 '에서' \G 동일팔레트에 팩터에서의 움직이십시오 처음부터: '\G (?: ^ \s+ 및 \s+) (\w+) = (\s+) '

러드 및 체비어 다가섰다는 평가를 받고 있지만 대부분 특정 문제를 좁히어 운행에서어떠한 둘 다 가지고 있습니다.

러드 것이 좋습니다.

/ x = (.+), y = ([^] +) (및 (제공합니다.*)? /

체비어 수정날짜 迈向:

/ ^ x, y = ([^] +) = (.+) (?: 그리고 (제공합니다.*)? /

두 번째 버전은 때문에 혼란을 &quot not_x = foo&quot, 더 나은 않습니다. &quot 함께, x = foo&quot. 하지만 같은 것을 인정하지 않을 것이고, x = y = z = 표시줄에는 &quot foo baz&quot. foo &quot 설정하고 1 달러 = z = bar"; 이는 것은 바람직하지 않다고 말했습니다.

이것은 아마도 너희는너희가 찾고 있다. &gt ^ x, y = (\w+) = (\w+), / (?: 그리고 (제공합니다.*)? /

이 옵션을 사용하면 할 수 없도록 하고, y = x = 간에, 장소 및 옵션 &quot. and.&quot. 될 수 있는 3 만달러 에

39 의 버전, 비교적 간단한 수정은 Rudd& 있다.

/^x=(.+) and y=([^ ]+)(?: and (.*))?/
하면, $2, 3 달러 1 달러 를 사용할 수 있습니다 (이?: 때문에 비캡처 group) 및 통해, 문자열, x = &quot &quot 시작됩니다. 대신 not_x &quot 허용 = "; 일치시키려면

더 잘 알고 있는 경우, x 와 y regex 를 더 조이려면 이 값을 사용해야 하는 것입니다.

my @strs = ("x=1 and y=abc and z=c4g and w=v4l",
        "x=yes and y=no",
        "z=nox and w=noy",
        "not-x=nox and y=present",
        "x=yes and w='there is no and y=something arg here'");

foreach (@strs) {
    if ($_ =~ /^x=(.+) and y=([^ ]+)(?: and (.*))?/) {
        $x = $1;
        $y = $2;
        $remainder = $3;
        print "x: {$x}; y: {$y}; remainder: {$remainder}\n";
    } else {
        print "$_ Failed.\n";
    }
}
출력:

x: {1}; y: {abc}; remainder: {z=c4g and w=v4l}
x: {yes}; y: {no}; remainder: {}
z=nox and w=noy Failed.
not-x=nox and y=present Failed.
x: {yes and w='there is no}; y: {something}; remainder: {}
참고로, 부족한 부분을 공백으로 인해 마지막 테스트는 테스트 테스트 없이 x, y 의 현재 버전은 동일한 경우 경식도 바꿔야 한다고 구체화하십시오 많았습니다.

39 m not 최대한 i&, 정규 표현식, 이는 어떤 예쁜 you& 닫으십시오 # 39, re 찾는 것 같다.

/x=(.+) and y=([^ ]+)( and (.*))?/

그러나, $2, 4 달러 와 1 달러 를 사용할 수 있습니다. 사용 중:

my @strs = ("x=1 and y=abc and z=c4g and w=v4l",
            "x=yes and y=no",
            "z=nox and w=noy");

foreach (@strs) {
    if ($_ =~ /x=(.+) and y=([^ ]+)( and (.*))?/) {
        $x = $1;
        $y = $2;
        $remainder = $4;
        print "x: $x; y: $y; remainder: $remainder\n";
    } else {
        print "Failed.\n";
    }
}

출력:

x: 1; y: abc; remainder: z=c4g and w=v4l
x: yes; y: no; remainder: 
Failed.

이는 당연히 많은 찻입 아웃해야 오류 검사, 쉐퍼드도 don& # 39, 모든 걸 알고 있지만, 이 t 너회의 투입물 작동합니까 것으로 보인다.

39 에 기본적으로 here& 내가 이 문제를 해결하지 못했다.

($x_str, $y_str, $remainder) = split(/ and /, $str, 3);

if ($x_str !~ /x=(.*)/)
{
    # error
}

$x = $1;

if ($y_str !~ /y=(.*)/)
{
    # error
}

$y = $1;

39, ve 생략된 i& 일부 추가 확인 및 오류 처리. 이 기술은 있지만, s # 39 는 it& 아닌 as I 또는 아주 간단한 좋아했잖아 있을 것이라고 말했다. # 39 m, 누가 더 좋은 제안을 할 수 있을 것으로 i& 가져다줄래요.

mirod
그는 11년 전 댓글을 달았습니다
0

이 날 것 중 어느 곳보다도 더 유지 관리, 한 개의 정규 표현식 &quot all&quot 가능해집니다. 솔루션뀉뀉뀉뀉. 난 아마 추가하기만 테레가스파스 시작할 때, y = x = a ^ 일치시키려면 사건을 피하기 위해 not_x =. 또는 이와 유사한. 왜 진행하시겠습니까 단일 정규 표현식?