문자열이 1/temperatoA,2/CelcieusB!23/33/44,55/66/77
이고 temperatoA
및 CelcieusB
이라는 단어를 추출하고 싶습니다. 정규 표현식을 사용하여 단어를 추출하십시오.
(\d+/(\w+),?)*!
을 가지고 있지만 난 단지 경기
1/temperatoA,2/CelcieusB!
이유를 얻을?
문자열이 1/temperatoA,2/CelcieusB!23/33/44,55/66/77
이고 temperatoA
및 CelcieusB
이라는 단어를 추출하고 싶습니다. 정규 표현식을 사용하여 단어를 추출하십시오.
(\d+/(\w+),?)*!
을 가지고 있지만 난 단지 경기
1/temperatoA,2/CelcieusB!
이유를 얻을?
당신이
(?<=\d/)\w+(?=.*!)
(?<=\d/)
이 자리하고 이전에 슬래시가 있다는 주장을 검색 할 수 있습니다 일치 항목의 시작
\w+
이 식별자와 일치합니다. 이것은 글자, 숫자 및 밑줄을 허용합니다. 문자 만 허용하려면 대신 [A-Za-z]+
을 사용하십시오.
(?=.*!)
은 문자열 -i 앞에 !
가 있다고 주장합니다. 이자형. 우리가 !
을 통과하면 정규식은 실패 할 것이다.
사용하는 언어에 따라 정규 표현식의 일부 문자를 이스케이프 처리해야 할 수 있습니다. .
E. g,합니다 (PCRE 라이브러리) C에서 사용하기 위해, 당신은 백 슬래시를 이스케이프해야합니다
myregexp = pcre_compile("(?<=\\d/)\\w+(?=.*!)", 0, &error, &erroroffset, NULL);
윌이 일을?
/([[:alpha:]]\w+)\b(?=.*!)
은 내가
단어은 알파벳 문자로 시작하는 다음과 같은 가정 ...
[[:alpha:]]
은 모든 영문자와 일치합니다.
\b
은 단어 경계를 찾습니다.
(?=.*!)
은 Tim Pietzcker's post입니다.
귀하의 전체 일치는 다음과 같은 표현과 일치하므로 '1/temperatoA,2/CelcieusB'
로 평가
qr{ ( # begin group
\d+ # at least one digit
/ # followed by a slash
(\w+) # followed by at least one word characters
,? # maybe a comma
)* # ANY number of repetitions of this pattern.
}x;
'1/temperatoA,'
먼저 캡처 # 1을 충족,하지만 당신은 엔진을 요구하고 있기 때문에 그것을 할 수있는 사람들의 많은을 캡처 되돌아 가서 패턴이 '2/CelcieusB'
(쉼표가 필요하지 않음)에서 반복되는 것을 찾습니다. 그래서 전체 경기는 그것이 무엇인지 당신이 말한 것입니다,하지만 당신은 아마 예상하지 않은 것은 '2/CelcieusB'
이 $1
가 '2/CelcieusB'
를 읽고 그래서, $1
으로'1/temperatoA,'
을 대체한다는 것이다.
특정 문자열에서 특정 패턴에 맞는 것을 캡처하려는 경우 항상 *** g *** lobal 플래그를 사용하여 캡처에 배열을 할당하는 것이 가장 좋습니다. 배열은 $1
과 같은 단일 스칼라가 아니므로 캡처 # 1에 대해 캡처 된 모든 값을 보유 할 수 있습니다. 나는이 작업을 수행 할 때
은 : 지금
$VAR1 = [
'1/temperatoA',
'temperatoA',
'2/CelcieusB',
'CelcieusB',
'23/33',
'33',
'55/66',
'66'
];
나는 당신이 기대했던 아마 피겨 :
my $str = '1/temperatoA,2/CelcieusB!23/33/44,55/66/77';
my $regex = qr{(\d+/(\w+))};
if (my @matches = $str =~ /$regex/g) {
print Dumper(\@matches);
}
내가이 얻을. 그러나
'3'
과
'6'
은
이며 문자는입니다. 따라서 슬래시 뒤에 오는 것은 표현식을 준수합니다.
따라서 문제가되는 경우 정규 표현식을 qr{(\d+/(\p{Alpha}\w*))}
으로 변경할 수 있습니다. 첫 번째 문자는 알파이고 그 뒤에 임의의 단어 문자 수를 지정해야합니다.
$VAR1 = [
'1/temperatoA',
'temperatoA',
'2/CelcieusB',
'CelcieusB'
];
을 그리고 당신은 단지 'temperatoA'
또는 'CelcieusB'
를 원하는 경우에, 당신은 당신이 필요하고 당신이 당신의 정규식 qr{\d+/(\p{Alpha}\w*)}
되고 싶은 것보다 더 포착하고 그런 다음 덤프는 다음과 같습니다.
그러나 캡처 식에서 두 개 이상의 청크를 캡처하는 비결은 배열에 일치 항목을 할당하는 것이므로 배열을 통해 정렬하여 원하는 데이터가 포함되어 있는지 확인할 수 있습니다.
+1 이것은 내게 망할 훌륭한 설명 인 것처럼 보인다. – Mike
어떤 정규식 엔진을 사용하고 있습니까? – Johnsyweb
답변을 수락해야합니다. – 0x499602D2