Apa's cara termudah untuk melakukan "instring" jenis fungsi dengan regex? Misalnya, bagaimana aku bisa menolak seluruh string karena kehadiran karakter tunggal seperti :
? Misalnya:
ini
- okeada:dan
tidak baik-baik saja karena :
Lebih praktis, bagaimana saya bisa mencocokkan string berikut:
//foo/bar/baz[1]/ns:foo2/@attr/text()
Untuk setiap node test pada xpath yang doesn't memiliki namespace?
(/)?(/)([^:/]+)
Akan cocok dengan node tes tetapi mencakup namespace prefix yang membuatnya rusak.
I'm masih tidak yakin apakah anda hanya ingin mendeteksi jika Xpath berisi namespace, atau apakah anda ingin menghapus referensi ke namespace. Jadi di sini's beberapa contoh kode (di C#) yang tidak baik.
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");
}
}
Harapan yang membantu! Good luck.
Saya tidak tahu sintaks regex sangat baik, tetapi bisa anda lakukan:
[apapun alpha numerik]\*:[setiap alfanumerik]\*
Saya pikir hal seperti itu harus bekerja bukan?
Ya, pertanyaan saya tidak sangat jelas. Berikut ini's solusi melainkan dari single pass dengan regex, saya menggunakan split dan melakukan iterasi. Ia bekerja juga tapi isn't seperti yang elegan:
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 );