2012-03-21 15 views
2

나는 사용자의 성을 얻을 수있는 텍스트 상자가 있습니다. 정규식에서 대시 (-)를 하나만 허용하려면 어떻게합니까? 한 다음,대시를 허용하는 정규식

  Pattern p = Pattern.compile("[^a-z-']", Pattern.CASE_INSENSITIVE); 
      Matcher m = p.matcher(name); 
+0

대시가 허용되는 패턴이 아닙니까? 내성에 대시가 없다고 가정 할 때 나는 그렇게 생각할 것이다. – dlev

+0

** 대시 ***가 아닙니다. 그것은 U + 002D, HYPHEN-MINUS 캐릭터입니다! 잊지 마세요 U + 2010 HYPHEN, U + 2011 비 손상 HYPHEN, U + 2012 FIGURE DASH, U + 2013 EN DASH, U + 2014 EM DASH, U + 2015 수평 바, U + 2053 SWUNG DASH, U + 207B SUPERSCRIPT MINUS, U + 208B SUBSCRIPT MINUS, U + 2212 MINUS SIGN, U + 2E3A TWO-EM DASH 및 U + 2E3B THREE-EM DASH. 더있다. – tchrist

답변

0

무효 값의 조각을 나타냅니다, 당신은 아마도 찾을 Matcher.find()을 사용하고 일부 경우 값이 정규식과 일치합니다. 그 맞습니까? , 또는 시작 두 문자의 순서를 비 레터 비 하이픈 비 - 아포스트로피 문자와 일치하여 (하이픈으로 끝나는 것

Pattern p = Pattern.compile("[^a-zA-Z'-]|-.*-|^-|-$"); 

: 그렇다면, 당신은 당신의 패턴을 변경할 수 있습니다 두 개의 하이픈을 포함하는 값 검색), 또는 하이픈, 또는 후행 하이픈.

+0

. 감사합니다. –

0

이 정규식은 하나 이상의 않은 하이픈를 나타내는 단일 하이픈 다음 :이 코드가 처음에 나 문자열 의 끝에 있어야 아니에요 비 - 하이픈. 중간에 하이픈이 백 슬래시로 이스케이프해야하는 경우

^[^\-]+\-[^\-]+$ 

나는 그건 아마 당신이 정규식을 위해 사용중인 플랫폼에 따라 다릅니다 ... 모르겠어요.

2

더 많은 regexy 용어로 질문을 다시 말하십시오. "단 한 개의 대시 만 허용하고 처음에는 사용할 수 없습니다."라고 말하면서 "문자열의 시작 부분에 이어 하나 이상의 대시가 뒤따라오고 하나의 대시가 뒤따라오고 대시가 아닌 하나 이상의 대시가 이어집니다. 그 다음에 문자열이 끝납니다. "

  • 문자열의 시작 : '^
  • 비 대시
  • 적어도 하나를 하나의 대시 뒤에 [^-]+
  • : -
  • 적어도 하나의 비 대시 다음이 : [^-]+
  • 다음 문자열의 끝 : $

영형. 이 문자열을 전체 문자열과 일치하는 컨텍스트에서 사용하는 경우에는 앵커가 필요하지 않습니다. 나중에 앵커를 사용하는 것이 좋을 수도 있습니다. 문자열 일치 맥락에서 정규식과에 다시 추가하는 것을 잊지.

그것은 당신의 정규식과 같은
+0

나는 이것이 정확하다고 생각하지 않는다; OP는 대시가 문자열의 끝에있을 수 없다고 명시 적으로 명시합니다. – dlev

+0

당신은 문자열 쿼리를 정규식으로 변환하는 방법을 배우는 비밀을 보여주었습니다. * 예배 * –

+0

@diev 미안하지만, 잘못 읽은 것 같습니다. 처음에는 그럴 수 없다고 생각했습니다. 편집 할 것입니다. Perry Monschau, 도와 드리겠습니다! :) – yshavit

2

indexOf()String에 사용하지 않는 이유는 무엇입니까?

String s = "last-name"; 
int first = s.indexOf('-'); 
int last = s.lastIndexOf('-'); 

if(first == 0 || last == s.length()-1) // Checks if a dash is at the beginning or end 
    System.out.println("BAD"); 
if(first != last) // Checks if there is more than one dash 
    System.out.println("BAD"); 

정규 표현식을 사용할 때보 다 느리지 만 일반적으로 작은 성의 이름을 사용하면 눈에 잘 띄지 않아야합니다. 또한 디버깅 및 향후 유지 관리가 훨씬 쉬워집니다.

+0

정규 표현식이 훨씬 효율적이기 때문에. –

+0

@PerryMonschau 사실일지도 모르지만,이 경우 문자열이 매우 짧아서 성능상의 이득이 최소화 될 것입니다. 또한이 코드는 정규식보다 요구 사항이 더 명확한 방법입니다 (많은 경우 (때로는 틀린) 정규식 답이 이미 제시되어 있습니다) – dlev

0

[a-z] - [a-z]과 같은 패턴을 사용해보세요.

패턴 p = 패턴.컴파일 ("[a-z] - [a-z]");

+0

http://regexpal.com에서 regEx를 테스트하십시오. /. – Shailesh

관련 문제