2017-12-05 45 views
0

Pattern.compile(正規表現)メソッドに入れる正規表現を作成する必要があります。 私のregexは整数(数字の先頭に0はない)、数字とchar(A-Za-z)のシーケンスを許さなければなりませんが、問題は3番目のポイントです:文字で始まり、 '' 'は、バックスラッシュが1つもない場合を除き、文字のバックスラッシュ(およびバックスラッシュがない限り)を避けなければなりません。Pattern.compile()メソッドの正規表現

しかし、私は2番目のポイント

public static void main(String[] args) { 
    if (args.length == 0) 
     throw new IllegalArgumentException(); 
    Matcher matcher = Pattern.compile("([a-zA-Z]+[0-9a-zA-Z_]*)|" 
      + "(0(?![0-9])|([1-9]+)([0-9]*))|" //"?!" è una asserzione : " se la condizione tra parentesi è vera non considerare lo zero 
      + "([\"]{1}(([\\\\][^\"\\][\\\"])*)[\"]{1})" 
      + "|(\\s+)").matcher(args[0]);// \s = [ \t\n\x0B\f\r] 
    System.out.println("Input: " + args[0]); //println va a capo dopo la stampa 
    while (matcher.lookingAt()) { 
     System.out.print("Lexeme '" + matcher.group() + "'"); //non va a capo dopo la stampa 
     System.out.println(" group " + ExampleLexer.getGroup(matcher)); 
     matcher.region(matcher.end(), matcher.regionEnd()); 
    } 

    //attenzione: matcher.hitEnd() restituisce true se il matcher arriva in fondo 
    //all'input anche se l'ultimo match non ha avuto successo, quindi funziona solo 
    //per espressioni regolari "semplici" 
    if (matcher.regionStart() == matcher.regionEnd()) 
     System.out.println("All lexems succesfully matched"); 
    else { 
     System.err.print("Unmatched lexem "); 
     matcher.usePattern(Pattern.compile(".*")); 
     matcher.lookingAt(); 
     System.err.println(matcher.group()); 
    } 
} 
+0

2番目のポイントは「_、一連の数字_」ですか? '\ d +'? [mcve]を入力してください。各要件にいくつかの列挙を使用すると読みやすくなります。もちろん、あなたには多くの誤りがありますが、どちらが言及されているかは言及していません。これが複雑な場合は、少なくともこれは例(入力/出力) – AxelH

+0

質問していただきありがとうございます:)私の問題は3点目です!このようなすべての文字列: "\\ hello \" "\ helloになる必要があります"しかし、私はそれを行う方法を知らない!私はバックスラッシュを意味し、 "muestは禁止されていますが、\\と\"は同意されなければなりません。 – Shinon

+0

エラーは次のとおりです:スレッドmain "java.util.regex.PatternSyntaxException:Unmatched closing")のインデックス89付近の例外 ([0-9] *))|(a-zA-Z)+ [0-9a-zA- ( "" {1}([(\(?= \ | \ "))] [^ \"]))*)["] {1})|(\ s +) ^ \t at java.util。 regex.Pattern.error(不明なソース) \t(java.util.regex.Pattern.compile) \t(java.util.regex.Pattern) (不明なソース)私は正規表現を読むことはありませんlab05_12_04.ExampleLexer.main(ExampleLexer.java:18)で \t – Shinon

答えて

0
"\"(\\\\.|[^\"\\\\])*\""   // (1) 
"\"(\\\\[\"\\\\]|[^\"\\\\])*\""  // (2) 
  • 引用
  • :私は、これは私のJavaコードである)エラーの多くを満たしています
  • 0回以上( ... )*
    • 、(1)任意の文字. /(2)任意の非引用/非バックスラッシュ
    • 又は|ない引用ではなく、バックスラッシュ\エスケープにバックスラッシュ[^ ... ]
  • 引用

  1. \"は、1つのchar、二重引用符を表す文字列エスケープです。
  2. \\は、バックスラッシュ(1文字)を表す文字列エスケープです。
  3. \\\\は、正規表現エスケープシーケンスではなく、バックスラッシュ自体を表す正規表現エスケープ\\です。
  4. バックスラッシュを置きたい場合は、最初に正規表現なしで試してみてください。s = s.replace("\\", "\\\\");はすべてのバックスラッシュを2倍にします。それがreplaceAllと正規表現でどのように書かれているかを推測してください。
+0

こんにちは、答えをありがとう!バックスラッシュは他のバックスラッシュまたは "char"ではない@ – Shinon

+0

@ Shinon \ t \ r \ n?その場合、引数として書く場合、 –

+0

は\\または\ "\ hello"出力は "匹敵しない語彙"でなければなりません。引数が "\\ hello \\\\" "と出力されたとしても、出力は\ hello \\" – Shinon