Regex Se respinge meciurile din cauza Instr

Care este cel mai simplu mod de a face o funcție de tip "instring" cu un regex? De exemplu, cum pot respinge un șir întreg din cauza prezenței unui singur caracter, cum ar fi : ? De exemplu:

  • this - okay
  • there:is - not okay because of :

Mai mult, practic, cum pot potrivi următorul șir:

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

Pentru orice test de nod pe xpath care nu include un spațiu de nume?

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

Se va potrivi testele nodului, dar va include prefixul spațiului de nume care o face defectă.

0
fr hi bn

5 răspunsuri

S-ar putea să doriți \ w care este un caracter "cuvânt". Din javadocs , acesta este definit ca [a-zA-Z_0-9], deci, dacă nu vreți să subliniați niciunul, este posibil să nu funcționeze ....

0
adăugat

Meci pe:? Cred că întrebarea nu este destul de clară, deoarece răspunsul este atât de evident:

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

Nu stiu foarte bine sintaxa regex, dar nu ai putea sa o faci:

[orice alfa numeric] \ *: [orice alfanumeric] \ *

Cred că ceva de genul ăsta ar trebui să funcționeze nu?

0
adăugat

Da, întrebarea mea nu a fost foarte clară. Iată o soluție, dar nu o singură trecere cu un regex, folosesc un split și efectuez o iterație. Funcționează la fel de bine, dar nu este la fel de elegant:

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 );
0
adăugat

Încă nu sunt sigur dacă ați vrut doar să detectați dacă Xpath conține un spațiu de nume sau dacă doriți să eliminați referințele la spațiul de nume. Deci, iată un exemplu de cod (în C #) care face ambele.

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");
    }
}

Sper că vă ajută! Mult noroc.

0
adăugat