2013-08-19 3 views
0

나는 find와 replace를 위해 정규 표현식을 사용하고 있으며 가능한 한 베스트 프랙티스를 사용하고자한다.Regex + vs *. 표준은 무엇입니까?

나는 +* 사이의 차이점을 알고 있습니다. reference*은 지정된 구문에 대한 모든 일치 항목을 찾고 +은 지정된 구문의 마지막 인스턴스를 제외한 모든 항목을 찾습니다.

인터넷에서 정규 표현식을 검색 할 때 +을 사용하는 많은 사람들이 보았습니다. *을 사용할 수 있다고 생각합니다. 일반 정규 표현식에 * 대신 +을 사용하는 표준이 있습니까? 아니면 누락 된 일부 규칙이 있습니까?

+3

나는 * 당신이'+'와'*'의 차이를 오해하고 있다고 생각하지만, 그 효과가 어떤 것이라고 생각하는지 몇 가지 예를 들어주십시오. –

+1

'*'와'+'에 대한 정의를 어디에서 얻을 수 있는지 모르겠지만 나에게 보이지 않습니다. '* '는 앞의 것 중 0 개 이상을 의미하고,'+'는 하나 이상의 것을 의미하며, 둘 다 가능한 한 많이 중얼 거린다. –

+0

"asdf1 asdf2 asdf3"문자열이 있는데 'asdf \ d \ s) +'를 찾으면 "asdf1 asdf2"와 일치하지만 '(asdf \ d \ s) *'를 찾으면 asdf1 asdf2 asdf3 "을 리턴하십시오. 또는 zzzzBov의 대답을 올바르게 이해하고 있다면 "asdf"에서 "asdf"+를 검색하면 "asdf"에서 일치하지 않으며 "asdfasdf"를 검색하면 모든 것이 일치합니다. – sparks

답변

2

링크 된 사이트는 훌륭하지만, *+의 정의를 오해하고 있습니다. 본질적으로 *은 "0 이상"을 의미하고, +은 "하나 이상을 의미합니다."즉

:

  • X* 의미"연속 X 문자 수, 또는 가능성이 전혀. "
  • X+은"행의 모든 ​​숫자가 X이지만 하나 이상은 입니다. "

그래서 X+XX* (또는 X*X)에 해당합니다. 그들은 모두 무한 상한하지만 서로 다른 제한이 더 낮을.

지금까지 하나의 표준/가장 좋은 방법은, 대답 인으로 둘 다 서로 다른 의미를 지니고 있기 때문에 "어느 쪽도 아니"지만, 하나 이상을 일치시키려는 경우 보다 XX*을 사용하는 것이 더 좋습니다. 둘 다 정확하지만 첫 번째 문자는 더 짧고 가독성이 우수합니다.

+0

모든 좋은 대답,하지만이 하나의 철자가 나를 위해 우리는 그 차이를 알려줍니다. 예제와 그와 동등한 구문을 보여 주셔서 감사합니다. – sparks

+0

@sparks - 도움이 되니 기쁩니다! –

0

정규 표현식은 사용되는 언어에 따라 다르지만 *+에 대해 잘못된 정의를 사용하고있는 것처럼 보입니다.

*

{1,} (한 번 이상)

+0

'*'또는'+'를 이해한다면 그는 아마도 {0,} 또는 {1,}을 이해하지 못할 것입니다. –

0

는 "+ 사용하는 대신 *의 일반적인 정규식 구문이나 인에 할 수있는 표준
+가 동일하다 {0,} (0 번 이상)과 동일 내가 놓친 몇 가지 국제 대회가 있습니까? "

아니요, 아니요. 어떤 사람들은 나쁜 정규식을 쓰고, 어떤 사람들은 구별 할 필요가 없으며, 어떤 사람들은 올바르게 이해합니다. 준수 할 특별한 협약은 없습니다.

그러나 zzzzBov는 지적한 * 및 + 의미에 대한 이해가 어긋나는 것으로 나타났습니다.

0

표준 정규 표현식에서 +은 "앞의 토큰 중 하나 이상"을 의미하는 반면 *은 "앞의 토큰 중 0 개 이상"을 의미합니다.

[0-9]+은 "하나 이상의 숫자"를 의미합니다.

[0-9]*은 "0 이상의 자릿수"를 의미합니다.

3

나는 당신이 그 문자의 의미에 대해 적절한 개념을 가지고 있다고 생각하지 않습니다. *은 지정된 이전 항목 (일반적으로 단일 문자, 문자 클래스 또는 괄호 안의 하위 패턴)을 0 번 이상 일치시키는 것을 의미합니다. 즉, 일치하는 문자열에 해당 항목이 여러 번 나타날 수 있습니다.

+ 문자/하위 패턴을 제외하고는 거의 똑같은 일이 1 회 이상 발생해야합니다.

그래서 차이는 다음과 같습니다

* - match 0 or more times 
+ - match 1 or more times 

더 가장 좋은 방법은 없다, 각각 적절하게 사용되어야한다.

+0

그래서 여기 다른 솔루션에서 의견을 수집, 그래서 내가 틀렸다면 나를 수정하십시오. 정규식 'asdf [0-9] +'를 사용하는 경우 'asdf0'과 일치하지만 'asdf'와 일치하지 않으며 정규식 'asdf [0-9] *를 사용하면'asdf0 '과' asdf '맞죠? – sparks

+0

@sparks 맞습니다. –