2016-04-06 10 views
4

現在、入力文字列に繰り返し文字がある場合はtrueを返し、それ以外の場合はfalseを返します。可能(コードゴルフのチャレンジのため)。私は正規表現では非常に良好ではないんだけど、私は、これはトリックを行うだろうと思った:(.)は任意の文字と\\1ある正規表現の繰り返し文字(\ 1は機能しません)

(.)\\1 

は、正規表現の最初の部分で見つかった試合への参照です。

しかし、「1223」私は入力のためにそれをしようとした場合、それは動作しません:私は理由22の真の期待していながら

public static void main(String[] a){ 
    System.out.println(java.util.regex.Pattern.matches("(.)\\1", "1223")); 
} 

これは、falseを返します。

java.util.regex.Pattern.matchesなどを使用して正規表現を修正する方法を知っている人はいますか?コードゴルフですか? ;)全体列はregexに対応

Here is an ideone for the test.

+0

codegolf.seを使用してください。 – Hackerdarshi

+5

'.matches'には完全な文字列の一致が必要です。' "。*(。)\\ 1。*" 'を使用してください。あるいは 'Matcher.find()'であなたのものを使用してください。 –

+0

@WiktorStribiżewああ、それは私の問題です!ありがとう。あなたが望むなら、それを答えとして加えることができます。私は、それが私の誤解を '.matches'としていることを知っていました.. –

答えて

3

Pattern.matches(regex, sequence)返すかどうか、一致しないサブストリングが存在しない場合。

あなたがやろうとしているものは、次の2つのいずれかを実行することができますについて:

  1. 使用正規表現".*(.)\\1.*"代わり
  2. 使用Matcherクラス:

    Matcher m = Pattern.compile(regex).matcher(sequence).find(); 
    int start = m.start(); 
    int end = m.end(); 
    
3

matchesは文字列全体を消費します。最初は.が "1"に一致し、次に\\1は次の文字として "1"を一致させようとし、失敗します。

は、次の2つのオプションがあります。

  • 使用find、または
  • がにあなたの正規表現を変更し.*(.)\\1.*

説明:.*が最初に一致しますので

2番目のオプションは、動作するようになりました全体の文字列、それは一致するには失敗します\\1、それはcharによってcharをバックトラックします.*が "1"と一致するまで、(.)\\1は "22"と一致し、最後の.*は残りの文字列と一致します。

関連する問題