1

たとえば、次の正規表現は、考えられるすべての有効な非軍事時間間隔を説明しようとします。次のように: "04-12:15"、"12:30-9"、"3:10-4:57"。

"<td class="text">2013-11-04</td>".

正規表現(正規表現の@MikeClarkへの別の同様の質問クレジットから):

regex = "(?<!\\d|-|:)((?:0?[1-9]|1[0-2])(?::[0-5][0-9])?-
                      (?:0?[1-9]|1[0-2])(?::[0-5][0-9])?)(?!\\d|-|:)"

正規表現の説明は次のとおりです。

(?<!\\d|-|:)数字、ハイフン、またはコロンの否定先読み すべて
(?:0?[1-9]|1[0-2])の有効な時間の
(?::[0-5][0-9])アカウント 有効なすべての分のアカウント
(?!\\d|-|:)数字、ハイフン、またはコロンの否定先読み

うまくいけば、残りは自明です。これは機能しますが、かなり冗長です。理論的には、これは次のように単純化できます。
EXP =とします。(?:0?[1-9]|1[0-2])(?:[0-5][0-9])?

"(?<!\\d|-|:)((?:0?[1-9]|1[0-2])(?::[0-5][0-9])?-EXP)(?!\\d|-|:)";

だから私の質問は:

(1) : 正規表現の一部を参照する方法はありますか? 後方参照は機能しません。これは、必要な式が一致するものではなく (キャプチャ グループであると仮定して)、式自体であるためです。式を String に格納して を使用できることは理解してformat()いますが、正規表現だけでこれを行うことができるかどうかを確認しています。

(2) : 私が考えることができる唯一の他のことは、式のどの繰り返しにあるかを判断できることです。次のように:

与えられた:regex = "...(?:someExpression){2}"

の1 回目か 2回目の繰り返しかを判断する方法はありsomeExpressionますか?

Javaまたはに関する回答Perlが私に最適です。

助けてくれてありがとう!

4

2 に答える 2

1

Is there any way to reference part of a regular expression??

はい、そうです。(?1)最初の定義グループを再利用するために表記を使用できます。あなたの場合は次のとおりです。

(?<!\d|-|:)(((?:0?[1-9]|1[0-2])(?::[0-5][0-9])?)-(?2))(?!\d|-|:)

もう 1 つのグループを作成する必要があります。

于 2013-11-05T13:04:19.903 に答える
0

おそらく最短/単純なバージョン:

パッケージの断片;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.util.regex.Pattern;

import org.junit.Test;

public class RegexTest {

    @Test
    public void test() {
        Pattern p = Pattern.compile("(0?[0-9]|1[0-2])(:[0-5][0-9])?-(0?[0-9]|1[0-2])(:[0-5][0-9])?");
        assertFalse(p.matcher("0").matches());
        assertFalse(p.matcher("1:00").matches());
        assertFalse(p.matcher("9:59").matches());
        assertFalse(p.matcher("10:01").matches());
        assertFalse(p.matcher("12").matches());

        assertTrue(p.matcher("04-12:15").matches());
        assertTrue(p.matcher("12:30-9").matches());
        assertTrue(p.matcher("3:10-4:57").matches());

        assertFalse(p.matcher("9:6").matches());
        assertFalse(p.matcher("9:60").matches());
        assertFalse(p.matcher("13").matches());
        assertFalse(p.matcher("20").matches());
        assertFalse(p.matcher("20:").matches());
        assertFalse(p.matcher("20-").matches());
        assertFalse(p.matcher(":20").matches());
        assertFalse(p.matcher("-20").matches());
    }

}

あなたの質問に:

(1) 私が知る限り、あなたが必要としているのはそのような方法ではありません。後方参照は、初回と同じ値を想定しています。http://www.regular-expressions.info/backref.html

(2) 私が知る限りではありません。

于 2013-11-05T02:25:39.860 に答える