Какой самый простой способ сделать функцию типа "instring" с помощью regex? Например, как я могу отбросить всю строку из-за присутствия одного символа, такого как :
? Например:
this
- нормальноthere:is
- не подходит из-за :
.Более практично, как я могу подобрать следующую строку:
//foo/bar/baz[1]/ns:foo2/@attr/text()
для любого теста узла в xpath, который не включает пространство имен?
(/)?(/)([^:/]+)
Будет соответствовать тестам узла, но включает префикс пространства имен, что делает его ошибочным.
I' m все еще уверенный, хотели ли Вы просто обнаружить, если Xpath содержит пространство имен, или хотите ли Вы удалить ссылки на пространство имен. Так here' s некоторый типовой кодекс (в 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");
}
}
Надежда, которая помогает! Удача.
Матч на :? Я думаю, что вопрос не достаточно ясен, потому что ответ настолько очевиден:
if(Regex.Match(":", input)) // reject
Я не очень хорошо знаю синтаксис regex, но не могли бы вы сделать:
[любой буквенно-цифровой]\*:[любой буквенно-цифровой]\*
.
Я думаю, что-то вроде этого должно сработать, нет?
Вам может понадобиться \w, который является "словом". Из javadocs он определяется как [a-zA-Z_0-9], так что если вы не хотите подчеркивания, то это может не сработать.....
Да, мой вопрос не был очень ясен. Here' s решение, а скорее, чем единственный проход с regex, я использую разделение и выполняю повторение. Это работает также, но isn' t как изящный:
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 );