일치해야 하는 다음 형식의 문자열이 있습니다.
./foo/baz/bar/filename.c
내 정규식은 다음과 같습니다
regex=$'^(\./)?([a-zA-Z0-9_-]+/)+([a-zA-Z0-9_-]+\.[a-z]+)$'
테스트는 다음과 같습니다
[[ $search =~ $regex ]]
존재하다이것스레드에 흥미로운 코드가 있습니다.코드 예사용자 예글렌 잭맨동일한 캡처 그룹의 반복 발생을 캡처하려면
global_rematch() {
local s=$1 regex=$2
while [[ $s =~ $regex ]]; do
echo "${BASH_REMATCH[1]}"
s=${s#*"${BASH_REMATCH[1]}"}
done
}
global_rematch "$mystring1" "$regex"
하지만 정규식에는 다음과 같은 것이 있습니다.하나캡처 그룹.내 거여기서는 상황이 조금 다릅니다.
내 $regex는 캡처 그룹의 여러 항목을 추출하려고 시도합니다. 그러나 캡처 그룹은 느리게 처리되며(또는 여기서 올바른 용어는 무엇입니까?? global matching
) 첫 번째 항목만 출력합니다. 다른 모든 것은 폐기됩니다.
$ printf "%s\n" "${BASH_REMATCH[@]}"
./foo/baz/bar/filename.c
./
bar/
filename.c
괄호를 하나 더 추가해야만 모든 이벤트가 출력되는데, 제가 원하는 결과는 아닙니다.
regex=$'^(\./)?(([a-zA-Z0-9_-]+/)+)([a-zA-Z0-9_-]+\.[a-z]+)$'
밝혀지다
echo "${BASH_REMATCH[2]}"
foo/baz/bar/
BASH_REMATCH
반복되는 모든 항목이 자체 인덱스에 의해 저장되도록 위의 코드 예제나 다른 솔루션을 적용하는 방법이 있습니까?
그러면 인덱스는 다음과 같이 표시됩니다.
echo "${BASH_REMATCH[2]}"
./foo/baz/bar/filename.c
echo "${BASH_REMATCH[1]}"
./
echo "${BASH_REMATCH[2]}"
foo/
echo "${BASH_REMATCH[3]}"
baz/
echo "${BASH_REMATCH[4]}"
bar/
echo "${BASH_REMATCH[5]}"
filename.c
어쩌면 캡처 그룹이 하나만 있는 두 개의 패턴 일치를 실행해야 할 수도 있습니다. 해결 방법으로.