SORU
6 Ocak 2009, Salı


Java düzenli olarak Adlandırılmış Gruplar

java.regex Paket grupları (http://www.regular-expressions.info/named.html) kimseye bir üçüncü taraf kitaplığı doğru beni işaret edebilir? adında desteği yok anladığım kadarıyla.

jregex baktım ama onun son sürüm 2002 yılında java5 altında beni (kuşkusuz sadece kısa bir süre çalıştı) için işe yaramadı.

CEVAP
6 Ocak 2009, Salı


(Güncelleme:Ağustos 2011)

geofflane his answer (upvoted), Java 7 now support named groups bahseder gibi.
tchrist desteğinin sınırlı olduğunu yorum yaparak puan.
Oonun büyük cevap sınırlamalar "Java Regex Helper" . ayrıntıları

Java 7 düzenli destek grubu adlı September 2010 in Oracle's blog sunulan geri döndü.

Java 7, adlı bir yakalama grubunu desteklemek için yapıları vardır: resmi açıklaması

  • (?<name>X) adlı bir grup adı tanımlamak için"
  • \k<name> adlı bir grup ile başlıyor"" . name
  • Eşleştirici yerine dizeye yakalanan grup için başvuru ${name}
  • Matcher.group(String name) verilen tarafından çekilen giriş subsequence dönmek için "Grup" adlı.

Önceden Java 7 için diğer alternatiflervardı:


(Orijinal cevap:Jan 2009önümüzdeki iki Link artık kırık)

Sen Düzenli kendi versiyonu kod sürece grup adlı başvurabilirsiniz

Gorbush2 did in this thread şeydir.

Regex2

(ASCII tanımlayıcıları tek arar gibi tchrist tarafından tekrar belirttiği gibi sınırlı uygulanması. tchrist ayrıntıları sınırlama olarak:

tek başına, grup adı aynı adlı (hangi her zaman bir kontrole sahip değilsin!) sahip olmak ve düzenli özyineleme için bunları kullanmak mümkün değil.

Not: Regexp Power, PCRE specs Matching Strings with Balanced Parentheses slayt belirtildiği gibi Perl ve / yukarıdaki diyagram gerçek düzenli özyineleme örnekler bulabilirsiniz

Örnek:

Dize:

"TEST 123"

RegExp:

"(?<login>\\w ) (?<id>\\d )"

Erişim

matcher.group(1) ==> TEST
matcher.group("login") ==> TEST
matcher.name(1) ==> login

Değiştirin

matcher.replaceAll("aaaaa_$1_sssss_$2____") ==> aaaaa_TEST_sssss_123____
matcher.replaceAll("aaaaa_${login}_sssss_${id}____") ==> aaaaa_TEST_sssss_123____ 

(uygulama özü)

public final class Pattern
    implements java.io.Serializable
{
[...]
    /**
     * Parses a group and returns the head node of a set of nodes that process
     * the group. Sometimes a double return system is used where the tail is
     * returned in root.
     */
    private Node group0() {
        boolean capturingGroup = false;
        Node head = null;
        Node tail = null;
        int save = flags;
        root = null;
        int ch = next();
        if (ch == '?') {
            ch = skip();
            switch (ch) {

            case '<':   // (?<xxx)  look behind or group name
                ch = read();
                int start = cursor;
[...]
                // test forGroupName
                int startChar = ch;
                while(ASCII.isWord(ch) && ch != '>') ch=read();
                if(ch == '>'){
                    // valid group name
                    int len = cursor-start;
                    int[] newtemp = new int[2*(len)   2];
                    //System.arraycopy(temp, start, newtemp, 0, len);
                    StringBuilder name = new StringBuilder();
                    for(int i = start; i< cursor; i  ){
                        name.append((char)temp[i-1]);
                    }
                    // create Named group
                    head = createGroup(false);
                    ((GroupTail)root).name = name.toString();

                    capturingGroup = true;
                    tail = root;
                    head.next = expr(tail);
                    break;
                }

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • brokenbellsVEVO

    brokenbellsV

    11 EYLÜL 2009
  • eisleyhead

    eisleyhead

    11 Ocak 2006
  • Sean Murphy

    Sean Murphy

    4 ŞUBAT 2009