2012-01-05 3 views
0

텍스트 상자에 포커스가 있으면 화면 키보드를 표시하고 싶습니다. 필드의 입력 범위에 따라 몇 가지 키보드를 표시 할 수 있습니다. 문제는 텍스트 상자의 예상 사용자 입력이 서버 구동이며 입력 범위 속성이 제공되지 않았고 (하나도 추가 할 수 없음)입니다. 사실, 내가 가진 모든 것은 필드에 대한 사용자의 입력을 검증하는 정규식입니다.정규식에서 텍스트 입력 범위 가져 오기

모든 정규식 문자열을 기반으로 텍스트 상자의 입력 범위를 결정하는 가장 좋은 방법은 무엇입니까?

입력 범위는 다음과 같습니다 등 이름 (문자 키보드 만), PHONENUMBER (숫자 전용 키보드),

일반적인 정규 표현식 "^ [0-9] {4,4} $", "^ [0 -9] {10,10} $ "하지만 훨씬 더 복잡 할 수도 있습니다.

+0

당신이하고있는 일을 분명히해야합니다. 사용자가 텍스트를 입력 한 후에 만 ​​정규식을 적용 할 수 있다면 InputScope의 요점은 무엇입니까? – keyboardP

+0

regEx를 역전하여 문자열 또는 숫자가 과도 할 것으로 예상하는지 확인합니다. 단순히 필드 목록을 가지고 값이 String 또는 Number 여야한다면 해당 목록을 사용하여 표시 할 키보드를 결정하십시오. –

+0

제출시 사용자 입력의 유효성을 검사하기 위해 정규 표현식을 사용하고 있습니다. 올바른 키보드를 표시하는데도 사용하고 싶습니다. –

답변

3

정규식의 입력 유형에 대한 하드 코딩은 옵션처럼 보이지만 불량한 것으로 보입니다.

얼마나 많은 입력 클래스가 있는지 알고 계십니까? 나는 네가 그렇게한다고 생각할거야. 당신은 다양한 입력 클래스와 일치하는 입력 샘플 세트를 만든 다음에 그것을 비교하는 진리표을,

EXAMPLE  | PHONE | NAME | TEXT | 
2061234567 | T  | F | T | 
206.123.4567 | T  | F | T | 
hello  | F  | T | T | 
brian  | F  | T | T | 
[email protected]$$ | F  | F | T | 

같은 필드에 대한 정규식을 가지고, 정규식을 통해 예를 들어 문자열을 실행해야하고, 진리 값을 입력 클래스에 매핑하는 테이블과 일치하는지 아닌지를 비교합니다. 여기에 예제 솔루션이 있지만 정확한 일치 작업 대신 추론을 사용하는 것이 좋습니다. (Java) :

int PHONE_CLASS = 0x18; // 11000 - the truth table value from above 
... 
Map<int, Keyboard> keyboardMap; 
keyboardMap.put(PHONE_CLASS, phoneKeyboard); 
... 
Keyboard inferKeyboard(Pattern regex) { 
    int matches = 0; 
    for (String example : examples) { 
    matches = matches << 1; 
    if (regex.matches(example)) { matches++; } 
    } 
    if (!keyboardMap.containsKey(matches)) { return GENERIC_KEYBOARD; } 
    return keyboardMap.get(matches); 
} 
0

트릭은 정규식 패턴에서 if 조건 내에 각 입력 범위의 형식을 지정하는 것입니다. 가장 제한적인 것으로 보이는 전화 번호로 시작합니다. 숫자, 대시, 마침표). 그렇다면 나는 다른 사람들에게 나아 간다. 정규식 전화 패턴이 강력하지 않으므로 조정할 필요가 있습니다.. 찾으면 정규식 패턴을 검사하여 명명 된 일치 검색 그룹에 어떤 텍스트가 삽입되는지 확인합니다. 명명 된 일치하는 캡처 그룹에 텍스트가 있으면 비올라! 사람은 그것이 무엇인지를 확인했다.

이 예제에는 전화, 주소 (주소는 숫자, 공백, 텍스트)와 기본 텍스트의 세 가지 유형이 있습니다. 그러나 내부적으로 더 많은 정보를 추가 할 수 있습니다. 패턴은보다 쉽게 ​​사용할 수 있도록 주석 처리됩니다.

void Main() 
{ 

    Console.WriteLine ("303-867-5309".DetermineScope() == InputScope.Phone); // True 
    Console.WriteLine ("1811 South Quebec Way".DetermineScope() == InputScope.Address); // True 
    Console.WriteLine ("Turk 181".DetermineScope() == InputScope.Text); // True 

} 

public enum InputScope 
    { 
     Phone,   // Digits and dividers 
     Address,   // number space then text 
     Text,   // Everything is text...final catch all. 
    }; 


public static class TestCaseExtensions 
{ 

    public static InputScope DetermineScope(this string text) 
    { 

     string pattern = @" 
(?(^[\d.\-/\\]+$)   # If: First check for phone; just numbers and dividers (no spaces) 
    (?<Phone>[\d.\-/\\]+) # Place into Phone named capture group 
|       # Else: start a new check 
    (?(^\d+\s\w+)   # If Check for address (if Address) 
    (?<Address>.*)  # Looks like its an address, place into address capture group 
    |      # Else 
    (?<Text>.*)   # Nope just text, place into text capture group 
    ) 
)"; 

    var result = InputScope.Text; // Default to the lowest...text 

    // Ignore allows us to document pattern; it is not related to processing text. 
    var match = Regex.Match(text, pattern, RegexOptions.IgnorePatternWhitespace); 

    if (match.Success) 
    { 
     result = 
     Enum.GetValues(typeof(InputScope)) 
      .OfType<InputScope>() 
      .Where (tp => match.Groups[tp.ToString()].Success) 
      .First(); 

    } 

    return result; 

    } 

} 

자세한 내용은 Regular Expressions and the If Conditional입니다.

관련 문제