0개 이상의 쉼표로 구분된 키워드와 일치

0개 이상의 쉼표로 구분된 키워드와 일치

쉼표로 구분된 0개 이상의 키워드와 일치하는 가능성을 원합니다.

나는 다음 정규 표현식을 사용합니다

if [[ "$var" =~ ^([^,]+(,[^,]+)*)*$ ]]; then
  echo "KY MATCH"
fi

나는 다음과 일치하고 싶다

var=""
var="keyword"
var="keyword,keyword"
var="keyword,keyword,keyword"

정규식을 단순화하거나 더 명확하게 만들 수 있나요?

답변1

Bash는 POSIX 확장 정규식을 사용합니다. try info bash -n 'Conditional Constructs'man 7 regex(첫 번째 명령의 경우 설치해야 하고 info, 두 번째 명령의 경우 man-pages).

키워드에 문자만 포함된 경우 문자 클래스를 사용 하거나 또는 를 [:alpha:]사용할 수 있습니다 .[:alnum:][:word:]

이 스크립트를 사용해보고 올바른 클래스를 선택하세요.


#!/bin/bash

for var in "" "keyword" "keyword,keyword" "keyword,keyword,keyword"; do
    [[ "$var" =~ ^([[:alpha:]]+,?)*$ ]] && echo "$var" MATCHES || echo "$var" DOES NOT MATCH
done

for var in "1" "key word" "key123word,keyword" "keyword, keyword ,keyword"; do
    [[ "$var" =~ ^([[:alpha:]]+,?)*$ ]] && echo "$var" MATCHES || echo "$var" DOES NOT MATCH
done

고쳐 쓰다

댓글에서 말했듯이 내 표현은 여기에 적용되지 않습니다 - keyword,keyword,. 이 표현이 적절한 것 같습니다 ^([[:alpha:]]+(,[[:alpha:]]+)*)*$. 어떻게 더 간단하게 만들 수 있을지 모르겠습니다.

답변2

쉼표로 구분된 키워드를 다음과 같이 정규식으로 변환하면 더 쉬울 수 있습니다.

#!/usr/bin/env -S bash - 

#keywords="keyword"
#keywords="aaa,bbb,ccc"
keywords="aaa,bbb,ccc,"
#keywords="ddd,"
#keywords=""

var='aaa'
regex="${keywords%,}"   # trim trailing ','
regex="${regex//,/\|}"  # replace ',' with '|'

printf 'Your var  : %s\n' "$var"
printf 'Your regex: %s\n' "$regex"

if [[ $var =~ ^($regex)$ ]]; then
    printf '%s\n' '-> it matches'
else
    printf '%s\n' '-> it does not match'
fi

이로 인해

$ temp/match-comma-separated-keywords.sh
Your var: aaa
Your regex: aaa|bbb|ccc
-> it matches

답변3

제외하려는 유일한 항목은 ,필드가 없는 특수한 경우를 제외하고 null로 구분된 필드인 것 같습니다. 따라서 ,첫 번째나 마지막 또는 두 개의 연속 문자열이 있는 문자열을 제외합니다.

case $string in
  (,* | *,,* | *,) echo>&2 not OK;;
  (*) echo OK;;
esac

또는

case ,${string:-empty}, in
  (*,,*) echo>&2 not OK;;
  (*) echo OK;;
esac

이는 표준 POSIX sh 구문이거나 Korn 스타일 구문을 사용합니다.

[[ ,${string:-empty}, != *,,* ]]. 불필요한 =~.

정규식은 다음과 같습니다.

[[ $string, =~ ^([^,]+,)*$ ]]

그러나 와일드카드 패턴을 사용하면 시스템의 정규식 엔진 및 그에 따른 문제(예: 비문자로 인한 질식)에 의존하지 않고도 이 작업을 수행할 수 있습니다.

[[ $string, = *(+([^,]),) ]]

관련 정보