Сведения о вопросе

Oleksandr

05:52, 12th August, 2020

Теги

regex   xpath    

Regex отклонение совпадений из-за Instr

Просмотров: 400   Ответов: 5

Каков самый простой способ сделать функцию типа "instring" с помощью regex? Например, как я могу отклонить целую строку из-за наличия одного символа, такого как : ? Например:

  • this -хорошо
  • there:is - не в порядке из-за :

Более практично, как я могу сопоставить следующую строку:

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

Для любого теста узла на xpath, который не включает пространство имен?

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

Будет соответствовать тестам узла, но включает префикс пространства имен, который делает его неисправным.



  Сведения об ответе

прога

19:21, 8th August, 2020

Я все еще не уверен, хотите ли вы просто определить, содержит ли Xpath пространство имен, или вы хотите удалить ссылки на пространство имен. Итак, вот пример кода (в 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");
    }
}

Надеюсь, это поможет! Удачи.


  Сведения об ответе

JUST___

04:30, 1st August, 2020

Матч на :? Я думаю, что вопрос недостаточно ясен, потому что ответ настолько очевиден:

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


  Сведения об ответе

dump

10:34, 15th August, 2020

Я не знаю regex синтаксис очень хорошо, но вы не могли бы сделать:

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

Я думаю, что что-то вроде этого должно работать нет?


  Сведения об ответе

ASER

23:44, 21st August, 2020

Вы можете захотеть \w, который является символом "word". Из javadocs он определяется как [a-zA-Z_0-9], поэтому, если вы не хотите подчеркивать, это может не сработать....


  Сведения об ответе

Chhiki

08:40, 9th August, 2020

Да, мой вопрос был не очень ясен. Вот решение, но вместо одного прохода с regex, я использую разделение и выполняю итерацию. Он работает так же хорошо, но не так элегантно:

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться