2017-12-22 19 views
-1

문자열이 배열의 배열로 시작하는지 확인하려고합니다. 여기 내 코드는 다음과 같습니다.배열에서 주어진 문자열로 시작하는 문자열을 확인하십시오. (대소 문자 무시)

string x = "Table a"; 
string y = "a table"; 
string[] arr = new string["table", "chair", "plate"] 
if (arr.Contains(x.ToLower())){ 
    // this should be true 
} 
if (arr.Contains(y.ToLower())){ 
    // this should be false 
} 

어떻게하면 if 문이 true가 될 수 있습니까? Id는 대소 문자와 다음 문자를 무시하면서 문자열 x의 시작 부분을 배열의 내용과 일치시키는 것을 좋아합니다. 나는 이것을 할 수있는 I needed regex을 생각했지만 착각 할 수있었습니다. 나는 정규 표현식을 가진 약간의 초보자이다.

+1

당신이 묻고있는 것이 명확하지 않습니다 ... 다시 말하십시오. 'if (...) '는 여기서 무엇을해야합니까? arr은 무엇입니까? x는 문자열입니까? 정규식? 무엇 ? –

+3

정규식이이 질문과 어떤 관계가 있는지 알지 못합니다. – Amy

+1

정규식이 들어있는 위치가 여전히 명확하지 않은 경우 ... 'StartsWith' (Any와 연계하여)를 원하는 것처럼 들립니다. –

답변

2

당신이 당신의 문자열 목록에서 요소가있는 경우에 검사 할 것 같다, 그래서 이것은 당신이 찾고있는 무엇을해야 : 또는 기반

if (arr.Any(x.ToLower().Contains)) 

:

if (arr.Any(c => x.ToLower().Contains(c))) 

또는 간단 귀하의 의견을 사용하실 수 있습니다 :

if (arr.Any(x.ToLower().Split(' ')[0].Contains)) 
+0

선행 문자를 무시하지 않기 때문에 작동하지 않습니다. "테이블"은 "테이블"과 일치하지 않아야하지만 "테이블 a"는 일치해야합니다. –

+0

@BrianUpward이 경우에는'Split'을 사용하십시오. ( –

+0

Split ('') [0] .Contains (c))) if (arr.Any (c => x.ToLower) insensitive'Contains' - https://stackoverflow.com/questions/444798/case-insensitive-containsstring –

-1

나는 당신이 여기에서 말하려고하는 것을 이해한다고 생각합니다. 아직 모호한 점이 있습니다. 당신의 문자열 (문장)에있는 한 단어가 배열에 존재하는지 확인하려고합니까?

@Amy가 정확합니다. Regex와 전혀 관련이 없을 수도 있습니다.

나는이 코드 세그먼트는 (쉽게 C 번호로 변환 할 수있는) 자바에서 원하는 것을 할 것이라고 생각 :

자바 :

x = x.ToLower(); 
string[] words = x.Split("\\s+"); 
foreach(string word in words){ 
    foreach(string element in arr){ 
     if(element.Equals(word)){ 
      return true; 
     } 
    } 
} 
return false; 

또한 요소를 저장하는 설정을 사용할 수 있습니다 배열에서 더 효율적으로 검색 할 수 있습니다.

자바 :

x = x.ToLower(); 
string[] words = x.Split("\\s+"); 
HashSet<string> set = new HashSet<string>(arr); 
for(string word : words){ 
    if(set.contains(word)){ 
     return true; 
    } 
} 
return false; 

편집 : 나는 C#에서 내 솔루션을 다시 썼다

(12/22 11:05 AM), @Amy 및 @JohnyL하여 미리 알림에 감사합니다. 저자는 문자열의 첫 번째 단어와 일치하고 싶어하기 때문에,이 편집 코드는 작동합니다 :)

C 번호 : 당신이 정규식을 설정할 수 있습니다

static bool contains(){ 
     x = x.ToLower(); 
     string[] words = x.Split(" "); 
     var set = new HashSet<string>(arr); 
     if(set.Contains(words[0])){ 
      return true; 
     } 
     return false; 
    } 
+0

내 질문을 편집했습니다. 기본적으로 x의 끝을 무시하고 배열의 모든 문자열 시작 부분을 일치 시키려고합니다. –

+0

'문자열 단어 : 단어'란 무엇입니까? 그것은 C#입니까? – JohnyL

+1

@BrianUpward이 솔루션은 x의 단어를 배열의 모든 요소와 일치시킵니다. 그것은 당신의 유스 케이스에서 작동합니다. – Ninja

0

당신이 정규식을 원하는 말했다 때문에 ... var regex = new Regex("(table|plate|fork)");
과 손의 문제에 대한 그것을 if(regex.IsMatch(myString)) { ... }

을 확인하지만, 당신은 당신이 정확한 문자열을 검색하는 것처럼 ... 당신은 @ S.Akb로
을 (사용할 수있는 정규식을 사용하여 필요 없다 당신은 매개 변수로 각 배열 요소를 가져 와서 검사를 수행 술어 소요 Any 필요 if (arr.Any(c => x.ToLower().Contains(c))) { ... }

+0

나는'var regex = new Regex ("(? i) (table | plate | fork)")')를 추가하겠다. :) – JohnyL

0

Enumerable.Contains 일치 정확한 값을 (그리고 "시작"에 대한 빌드를 비교하는 검사에 없음) : 아리 언급했다.그래서 첫 번째 단계는 당신이 원하는 것입니다 주위에 다른 방법을 "포함"-처럼 배열에서 요소를 포함하는 문자열을 제공 : 당신이 실제로 요구 이제

var myString = "some string" 
    if (arr.Any(arrayItem => myString.Contains(arrayItem)))... 

"문자열이 주어진 단어로 시작"그냥 포함하지 - 그래서 당신 분명히 StartsWith 필요 (편리 대소 문자 구분을 지정할 수 있습니다 Contains 달리 - Case insensitive 'Contains(string)') :이 코드는 "tableAAA 밥을"받아 들일 것

 if (arr.Any(arrayItem => myString.StartsWith(
       arrayItem, StringComparison.CurrentCultureIgnoreCase))) ... 

하는 것으로 - 당신이 정말로 더 나은 선택이 될 수 있습니다 단어 경계 정규 표현식에 중단해야하는 경우 . 정규 표현식을 동적으로 작성하는 것은 모든 값을 적절히 벗어나지 않는 한 사소한 것입니다.

정규식은 문자열의

  • 시작해야한다 - ^
  • 제대로 검색하려는 단어를 탈출 - 휴식 Escape Special Character in Regex
  • 단어 - \ B

    if (arr.Any(arrayItem => Regex.Match(myString, 
         String.Format(@"^{0}\b", Regex.Escape(arrayItem)), 
         RegexOptions.IgnoreCase)) ... 
    
+0

확실히 더 쉬워 보인다. 답변 해주셔서 감사합니다! 나는 다음 번에 그것을 염두에 두겠다. –

+0

@BrianUpward'StartsWith'는 단어 경계를 검사하지 않는다는 점에 유의하십시오. 또한 정규 표현식 버전을 추가했습니다. –

-1

죄송합니다 내 질문은 너무 애매했지만 다시 답변을 몇 사람의 도움을 주셔서 감사합니다 솔루션입니다.

var regex = new Regex("^(table|chair|plate) *.*"); 
if (regex.IsMatch(x.ToLower())){} 
+1

선택한이 솔루션은 검색 한 값을 하드 코드하고 arr의 내용을 사용하지 않습니다. 귀하가 물어 본 질문은 귀하의 솔루션과 전혀 관련이 없으며 오해의 소지가 있습니다. – simonzhu

+0

이 대답은 'table a'와 'tablet'을 정확하게 구분하지 않습니다 ('tablet'이 맞지 않아야 함). –

+0

그냥 내가 틀렸다는 말 대신에 대답을 도와 주면 좋을 것 같습니다. –