2016-08-31 2 views
0

일부 데이터 처리의 경우 문자열을 여러 항목으로 분할해야합니다. 입력 문자열의 예는 다음정규 표현식으로 두 자리 사이에있는 특정 문자 일치

'one, two & three and four-five 123-456' 

지금, I 가능한 구분자가 ,, &, (공간)되는 항목, and, -으로 문자열을 분리 할 필요가있다. 그러나 이것이 내가 붙어있는 지점입니다. 두 개의 숫자 사이에있을 때는 -으로 나눠서는 안됩니다.

내가 실제 분할을 할 PHP와 preg_split를 사용하고,하지만 난 구분 기호를 제외한 구분 기호를 일치하는 정규식 패턴을 필요 -이 두 숫자 사이에 (숫자뿐만 아니라 123-456 될 수 있습니다) 때. 각 항목 주위의 공백은 PHP에서 trim()으로 처리됩니다. 나는 다음과 같은 정규식 패턴을 사용하고

: (preg_split 사용 후 등)

/(and|,|\s|&)|\D(-)\D/ 

출력은 다음과 같습니다

[0] => one 
[1] => two 
[2] => three 
[3] => fou 
[4] => ive 
[5] => 123-456 

작업은 정확하지만 그것은 또한 먼저 마지막과 소요 - 구분 기호에 대한 주변 텍스트의 문자. 항목 번호 123-456-의 숫자가 즉시 둘러싸 일 때 일치하지 않아야하며 (preg_split으로 나눠서는 안됨) 올바른 것입니다.

예상 출력은 다음과 같습니다 어떤 정보를 알려 나는 내 질문에 업데이 트됩니다 수 있도록 부족한 경우

[0] => one 
[1] => two 
[2] => three 
[3] => four 
[4] => five 
[5] => 123-456 

어떤 도움이, 감사합니다.

답변

2

당신이 사용하고자하는 (더 일반적으로 lookaround라고도 함) lookahead and lookbehind입니다 :

할 것이는 이름에서 알 수 있듯이 정확히 무엇
/and|,|\s|&|(?<!\d)-(?!\d)/ 

- 지정된 패턴이 일치하는 경우없이, 확인하기 위해 주변 봐 일치하는. 이 경우 양측이 숫자로 둘러싸인 -과 일치하지만 (\d 초) 일치가 일 때만 -이됩니다. 이 경우

(?<!\d)부정적인 lookbehind - 그것은 바로 앞의 문자열 하지 일치하는 패턴을하지 있는지 확인하기 위해 뒤쪽으로 볼 것이다. 일치하면 실패한 것으로보고하고 계속 진행합니다. 마찬가지로 (?!\d)부정적 미리보기입니다. 정확히 같은 일을하지만 반대 방향입니다. -이 사이에 끼어 있기 때문에 효과는 "양쪽에 숫자가 없으면 -과 일치합니다"입니다.

+0

감사합니다. 이것은 나의 질문을 해결했다. 그것이 나를 허용 할 때 나는 당신의 대답을 수분 안에 받아 들일 것이다. 관심이 없으면 첫 번째 부분의 표기법이 다른 이유는 무엇입니까? 그것은 내 것과 정확히 똑같이 작동하지만, 다른 일을합니까? –

+1

간단한 설명을 추가했습니다. –

+2

마지막 교체 부분은'(? revo