2008-08-13 20 views
2

Bir "instring" tipi işlevini normal ifadeyle yapmanın en kolay yolu nedir? Örneğin, : gibi tek bir karakterin varlığı nedeniyle tüm bir dizeyi nasıl reddedebilirim? Örneğin:Regex Instr nedeniyle eşleşmeleri reddetme

  • this - tamam
  • there:is - tamam değil pratikte nedeniyle :

Daha ben şu dizeyle eşleşen nasıl: Herhangi düğüm testi için

//foo/bar/baz[1]/ns:foo2/@attr/text() 

bir ad alanı içermeyen xpath üzerinde?

(/)?(/)([^:/]+) 

düğüm testleri maç ama hatalı yapar gibi önek içerir Will.

cevap

0

ben çok iyi regex sözdizimi bilmiyorum ama yapamadı:

[any alpha numeric]\*:[any alphanumeric]\*

Böyle bir şey yok çalışması gerektiğini düşünüyorum?

1

Maçda:? Cevabın çok açık olduğu için soru yeterince açık olmadığını düşünüyorum: hangi w bir "kelime" karakter \

if(Regex.Match(":", input)) // reject 
0

Sen isteyebilirsiniz. javadocs'dan itibaren, [a-zA-Z_0-9] olarak tanımlanmıştır, bu nedenle alt çizgiler istemiyorsanız, bu işe yaramayabilir ....

0

Evet, sorum çok açık değildi. İşte bir çözüm ama bir regex ile tek bir geçiş yerine, ben bir bölünmüş kullanın ve yineleme gerçekleştirin. O da çalışıyor ama şık değil:

string xpath = "//foo/bar/baz[1]/ns:foo2/@attr/text()"; 
string[] nodetests = xpath.Split(new char[] { '/' }); 
for (int i = 0; i < nodetests.Length; i++) 
{ 
    if (nodetests[i].Length > 0 && Regex.IsMatch(nodetests[i], @"^(\w|\[|\])+$")) 
    { 
     // does not have a ":", we can manipulate it. 
    } 
} 

xpath = String.Join("/", nodetests); 
1

Bana az önce XPath bir ad alanı içeriyorsa algılamak isteyip emin değilim, ya da ad başvuruları kaldırmak isteyip. Yani, her ikisini de içeren bazı örnek kodlar (C#).

class Program 
{ 
    static void Main(string[] args) 
    { 
     string withNamespace = @"//foo/ns2:bar/baz[1]/ns:foo2/@attr/text()"; 
     string withoutNamespace = @"//foo/bar/baz[1]/foo2/@attr/text()"; 

     ShowStuff(withNamespace); 
     ShowStuff(withoutNamespace); 
    } 

    static void ShowStuff(string input) 
    { 
     Console.WriteLine("'{0}' does {1}contain namespaces", input, ContainsNamespace(input) ? "" : "not "); 
     Console.WriteLine("'{0}' without namespaces is '{1}'", input, StripNamespaces(input)); 
    } 

    static bool ContainsNamespace(string input) 
    { 
     // a namspace must start with a character, but can have characters and numbers 
     // from that point on. 
     return Regex.IsMatch(input, @"/?\w[\w\d]+:\w[\w\d]+/?"); 
    } 

    static string StripNamespaces(string input) 
    { 
     return Regex.Replace(input, @"(/?)\w[\w\d]+:(\w[\w\d]+)(/?)", "$1$2$3"); 
    } 
} 

Bu yardımcı olur umarım! İyi şanslar.