regexp_replace를 사용하여 문자열 주위의 작은따옴표를 바꾸지만 단어 안에는 넣지 않음(예: can't)

regexp_replace를 사용하여 문자열 주위의 작은따옴표를 바꾸지만 단어 안에는 넣지 않음(예: can't)

나는 bash 스크립트에서 아래 코드를 사용하여 postgres 데이터베이스의 제목 열에 있는 작은따옴표를 공백으로 바꿉니다.

psql -U postgres -d my_database -c "UPDATE my_table SET title = regexp_replace(title, '''', ' ', 'g')"

내 문제는 예를 들어 다음과 같이 문자열 주위의 작은따옴표를 제거하려고 한다는 것입니다.

this is example 'number one' ok

된다

this is example  number one  ok 

이것은 내가 바라던 대로 작동합니다. 그러나 단어 내에서 작은따옴표도 제거하므로 다음과 같습니다.

can't

된다

can t

문자열 주위의 작은따옴표만 바꾸도록 지정하려면 어떻게 해야 합니까?

답변1

한 번만 교체하면 좋은 방법이 없다고 생각합니다. 그러나 4번의 교체가 괜찮다면 다음과 같이 진행하십시오.

  1. 대체 \A'대상  (즉, '문자열의 시작 부분에서 대체)입니다.

  2. '\Z다음 으로  바꾸기 (즉, '문자열 끝에서 바꾸기).

  3. 전역적 ([^[:alnum:]])'으로  다음으로 대체합니다 \1. 즉, 영숫자가 아닌 문자의 모든 시퀀스를 '영숫자가 아닌 문자 및로 대체합니다 .

  4. '([^[:alnum:]])전역적 으로  대체 \1(즉, '영숫자가 아닌 문자 의 모든 시퀀스를  영숫자가 아닌 문자로 대체합니다.)

최종 효과는 '앞에 있는 항목을 제외한 모든 항목을 바꾸는 것입니다.그리고그 뒤에 영숫자 문자가 옵니다.

면책조항: 저는 PostgreSQL에 대해 전혀 모릅니다. 이를 PostgreSQL 구문으로 직접 변환해야 합니다.

답변2

'더 영리한 정규식을 사용하세요. " " 및 " '"( SPACE APOSTROPHE및 ) 를 바꾸면 APOSTROPHE SPACE단어 내 아포스트로피가 누락됩니다.

답변3

단어에서 아포스트로피를 피하려면 왼쪽이나 오른쪽에 문자가 없는 아포스트로피를 찾으세요. 그러한 아포스트로피를 찾는 정규식은 다음과 같습니다.

([A-Za-z])\'([^A-Za-z])|([^A-Za-z])\'([A-Za-z])|([^A-Za-z])\'([^A-Za-z])

또는 더 짧음

\'([^A-Za-z])|([^A-Za-z])\'

아니면 더 짧아도

\'([^\w])|([^\w])\'

나는 regexp_replace가 될 것 같아요

regexp_replace(title, '\'([^\w])|([^\w])\'', '\1', 'g')

나는 psql에 익숙하지 않으므로 올바른 synatx는 다음과 같습니다.

regexp_replace(title, '''([^\w])|([^\w])''', '\1', 'g')

관련 정보