2012-10-31 2 views
0

이것을 어떻게 정규식으로 쓸 수 있습니까?문자열에 대한 정규식을 작성하는 방법은 무엇입니까?

"blocka # 123 # 456"

나 데이터 의 매개 변수를 분할 # 심볼을 사용한 상기 파라미터 블록 명, STARTX는 Y의 corrdinate

이 좌표 시작되는 임베디드 데이터 인 내 QR code.so에서 나는 QR을 스캔 할 때 나는 그것들이 스캐닝 중인지를 확인하고 싶다. 그 때문에 위의 구문에 대한 정규식이 필요합니다.

내 메소드 본문

그것은 당신이 일치하려는 작업에 따라
public void Store_QR(String qr){ 
    if(qr.matches(regular Expression here)) { 
     CurrentLocation = qr; 
    } 
    else // Break the operation 
} 
+0

QR 코드의 정확한 패턴은 무엇입니까? 더 많은 예제를 만들 수 있습니까? –

+1

구체적인 내용을 구체적으로 설명해주십시오. E.G. #가 무엇인지, 리터럴 문자 #에 해당하는지, 리터럴 문자열이 "blocka"인지 또는 6 문자 길이의 텍스트인지를 나타내는 것입니다. 이 질문에 답하면 정규 표현식 자체를 설명 할 수 있습니다. 나는 당신이이 질문에 대답하면 자신에게 대답 할 수 있고 정규 표현식을 배워서 자신감을 가질 수 있다고 확신합니다. – hsanders

+0

문자열 패턴이 BlockName # start_X # end_X – Ruby

답변

1

myregexp.com은 약간의 테스트를하는 것이 좋습니다.

공식 Java Regex Tutorial 공식적으로 알아두면 좋지만 대부분 알아야 할 사항이 포함되어 있습니다.

Pattern 설명서에는 위 튜토리얼에서 누락 된 공상 미리 정의 된 문자 클래스도 포함되어 있습니다.

당신이 준 예제에서 규칙적인 사항을 지정하지 않았습니다. 정규 표현식은 입력을 검증하는 규칙이있는 경우에만 의미가 있습니다.

정확히 "blocka#123#456" 일 경우 "blocka#123#456" 또는 "^blocka#123#456$"은 정규식으로 사용됩니다. 내용이 ^$ 사이 인 것은 정규식 내부가 입력의 시작에서 끝까지 이어져야 함을 의미합니다. 때로는 필요하고 일반적으로 정규식 주위에 두는 것이 좋습니다.

blocka 동적이면은 적어도 하나의 길이 z 통해 소문자 a 임의의 순서와 일치하도록 [a-z]+로 대체.block[a-z]blocka, blockb 등과 일치합니다. 및 [a-z]{6}은 정확히 6 자의 모든 시퀀스와 일치합니다. [a-zA-Z]에는 대문자가 포함되고 \p{L}은 유니 코드 포함 글자 (예 : Blüc本)와 일치합니다.

##과 일치합니다. 특수 정규식 의미가없는 문자 (\^$ . | ? * + () [ ] { })와 같은 문자가 일치합니다. [^#]#을 제외한 모든 문자와 일치합니다. 숫자에 관한

: [0-9]+ 또는 \d+ 여러 번호에 대한 일반적인 패턴, [0-9]{1,4}007, 5, 9999처럼 1-4 숫자에서 구성된 아무것도 일치합니다. 예를 들어, (?:0|[1-9][0-9]{0,3})09999 사이의 숫자와 일치하며 앞에 오는 0을 허용하지 않습니다. (?:STUFF)은 (는) Matcher#group(1..?)을 통해 추출 할 수있는 그룹에 영향을주지 않는 비 캡처 그룹입니다. |을 사용한 논리적 그룹화에 유용합니다. (?:0|[1-9][0-9]{0,3})의 의미는 단일 0 OR (1x 1-9 다음에 0-3x0-9)이 올 수 있습니다.

은 너무 일반적이어서 사전 정의가 있습니다. \d (자릿수)입니다. \을 탈출해야하므로 정규 표현식 String 안에 \\d이 있습니다.

그래서 옵션 중 일부는 blocka에 의해 분리 된 숫자 적어도 하나 개의 그룹에 의해 다음과 일치 "hello #world!1# -12.f #本#foo#bar"

  • "^blocka(#\\d+)+$"처럼 #에 의해 분리 된 모든 항목과 일치 절대적으로 모든 것을
  • "^[^#]+(?:#[^#]+)+$" 일치

    • ".*" 있습니다 # 예. 단지 바로 해당 문자열과 일치하는 # 마지막 번호 400-999
    • "^blocka#123#456$" 다음 399, - 그것은 숫자 0 다음에 blocka#을 발견 한 경우에만 일치합니다 blocka#1#12#0007#949432149#3
    • "^blocka#(?:[0-9]|[1-9][0-9]|[1-3][0-9]{2})#[4-9][0-9]{2}$".

    모두 당신이 준 예제와 일치하는 정규 표현식입니다.

    는하지만 아마

    public void Store_QR(String qr){ 
        if(qr.matches("^blocka#\\d+#\\d+$")) { 
         CurrentLocation = qr; 
        } 
        else // Break the operation 
    } 
    

    또는


    BlockName # start_X # start_Y 어떤 블록 이름

    private static final Pattern QR_PATTERN = Pattern.compile("^blocka#(\\d+)#(\\d+)$"); 
    public void Store_QR(String qr){ 
        Matcher matcher = QR_PATTERN.matcher(qr); 
        if(matcher.matches()) { 
         int number1 = Integer.valueOf(matcher.group(1)); 
         int number2 = Integer.valueOf(matcher.group(2)); 
         CurrentLocation = qr; 
        } 
        else // Break the operation 
    } 
    

    만큼 간단합니다 ..문자열 "블록"로 시작하고 난 그에게 좋은 정규식, "block"을 시작으로 "^block\\w+#\\d+#\\d+$" 것 같아요 두 개의 정수

    다음 다음 a의 조합 - z, A - Z, 0-9_ (thats the \w) 다음에 #, 숫자, #, 숫자가옵니다.

    는 전혀 이름이 없기 때문에 block_#0#0, blockZ#9#9, block_a_Unicorn666#0000#1234 있지만 block#1#2을 일치합니다 때문에 문자 대신 숫자의 blockName#123#abc 일치하지 않습니다. 이름 부분 (\\w+)가 너무 진보적 ​​인 경우도 있기 때문에 대문자 B.

    Block_a#123#456 일치하지 않을까요 (____123 법적 이름이 될 것입니다) 예를 들어, 사용 "^block_?[a-zA-Z]+#\\d+#\\d+$", 번호와 이름을 허용하지 않는 것은 단일 선택 사항 인 _으로만 구분할 수 있으며 그 후에 문자가 있어야합니다. _a, a, _ABc이 허용되지만, _, _a_b, _a9이 아님. 이름에 숫자를 허용하려면 [a-zA-Z0-9] 문자 클래스를 사용하십시오.

  • +0

    내가 원하는 것은 다음과 같은 문자열인지 확인하는 것입니다. BlockName # start_X # start_Y 모든 블록 이름. 문자열 "block"로 시작하여 두 개의 정수가옵니다. 해시 기호를 사용하여 세 개의 매개 변수를 분리하십시오. 답장을 보내 주셔서 감사합니다 :) 많이 의미합니다! – Ruby

    +0

    blockname은 block_a, block_b, block_c 일 수 있습니다 .. – Ruby

    +0

    @Ruby 몇 가지 제안 사항을 추가했습니다. 필요에 따라 자유롭게 개선 할 수 있습니다 :) – zapl

    3

    .

    1. 는 여기에 몇 가지 정규식 제안은 다음과 같습니다

      ^blocka#[0-9]{3}#[0-9]{3}$ 
      ^blocka#[0-9]+#[0-9]+$ 
      ^blocka(#[0-9]{3}){2}$ 
      ^blocka(#[0-9]+){2}$ 
      ^blocka(#[0-9]{3})+$ 
      ^blocka(#[0-9]+)+$ 
      
    2. 그렇지 않으면, 단지 contains() 또는 유사한을 사용합니다.

    5

    귀하가 지정한 정보는 정규 표현식을 사용하여 정의하지 않습니다.

    더 일반적인 방법으로 시도해보십시오.

    [a-z]+#\d+#\d+ 
    

    을 그리고 당신은 3 개 부분 캡처하려는 경우 : 당신이 정말로 "blocka # 123 # 456"를 검색해야하는 경우

    다음 qr.contains("blocka#123#456");

    0

    을 사용 나는 제안

    ([a-z]+)#(\d+)#(\d+) 
    

    Matcher.group(1, 2 or 3) 부품을 반환합니다

    관련 문제