2017-03-16 1 views
0

Leetcode에는 "단어 목록이 있으면 한 줄의 미국식 키보드에서만 알파벳 문자를 사용하여 입력 할 수있는 단어를 반환합니다."라는 질문이 있습니다. [ "A", "B", "P", :, 때와 같은 입력matche의 결과가 표현식과 다른 이유는 무엇입니까?

public string[] FindWords(string[] words) 
    { 
     return words.Where(x => Regex.Match(
     x, @"[qwertyuiop]*|[asdfghjkl]*|[zxcvbnm]*", 
     RegexOptions.IgnoreCase).Value == x).ToArray(); 
    } 

을하지만 여전히 됐는 예를 얻을 수 없습니다 :이 문제를 해결하기 위해, 나는 다음과 같은 C#에서 정규 표현식을 사용하려고 "hello"]

"p"만 반환 할 수 있습니다.

어디에서 잘못 했습니까?

+0

"올바르지 않은"것은 무엇입니까? [질문하기 전에 작은 프로그램을 디버깅하는 방법] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 배워야합니다. –

+0

@ScottChamberlain 나쁜 예입니다. 어설 션의 양은 올바른 정규식을 작성하는 데 도움이되지 않습니다. 예, 테스트 우선 접근법은 훌륭하지만 일정 수준의 온전하고 일반적인 상식이 적용됩니다. "Hello World"를 작성해야하는 경우 메소드에 대해 적어도 7 개의 어설 션 및 테스트를 작성하는 것은 시간 낭비입니다. –

+2

@PhilP. 아니, 그 여전히 매우 relevent. 가장 도움이 될만한 기사의 조언은 * "[프로그램을 진행하는 동안] 목록에없는 항목이 있으면 목록에 실수가있는 것입니다. 프로그램에 오류가 있거나 프로그램에 실수가있는 경우 실수로 코드를 작성한 경우 잘못되었다는 것을 수정하십시오. 수정 방법을 모르는 경우 적어도 지금은 특정 기술적 인 질문이 있습니다. StackOverflow! "* OP는 정규 표현식에서 실수를 범했습니다. –

답변

2

정규식 패턴은 달성하려는 것에 다소 벗어났습니다. 그것을보고 분석해 봅시다.

먼저 시작과 끝이있는 단어를 실제로 일치 시키려고한다는 것을 나타내야합니다. 그것은 우리가 ^으로 정규식을 앞에 추가 문자열의 시작과 끝을 나타 내기 위해 마지막에 $를 추가 할 필요가 있다는 것을 의미한다.

그런 다음 실제로 단어가 있는지 확인해야합니다. 즉 적어도 하나의 문자가 있어야합니다. "하나 이상의 문자"규칙을 시행하려면 * 대신 + 한정 기호를 사용해야합니다.

마지막으로, 우리가 한 행의 문자를 사용하고 있는지 확인하지 않습니다 사용하려는 정규식 패턴. 그것은 각 캡처 그룹 (OR 연산자 사이의 섹션)을 보장하지만 문자열을 무효로해야하는 시나리오가있는만큼 많은 캡처 그룹을 갖게됩니다. 어떤 기본적으로 다음과 같은 단어가 여전히 유효 것을 의미한다 : "을", "다"와 "Y"

today 

정규식 세 캡처 그룹과 일치하는 것입니다. 대신 그룹화를 명시 적으로 설정해야합니다. 다음 패턴으로 끝났습니다 :

^([qwertyuiop]+|[asdfghjkl]+|[zxcvbnm]+)$ 
+0

감사합니다. 내가 표현을 확인하고 반복적으로 Match 함수의 문서를 보았지만 여전히 얻을 수없는 것을 사용했습니다 .... 나는 정규 표현식이 익숙하지 않다는 것을 이해하는 것처럼 보입니다 ... 귀하의 매우 유용한 답변을 위해 다시 한번 감사드립니다! – overflow

+0

@overflow Regex 표현식을 만들고 검증하는 데 https://regex101.com/을 강력히 추천합니다. Regex가 (오른쪽에서) 어떻게 처리되는지에 대한 매우 유용한 설명을 제공하여 복잡한 표현을 여러 번 구해주었습니다. –

+0

초심자에게 매우 가치있는 사이트를 제공해 주셔서 감사합니다. – overflow

관련 문제