3

使用正则表达式执行“instring”类型函数的最简单方法是什么?例如,我怎么能因为存在单个字符(例如?)而拒绝整个字符串:?例如:

  • this- 好的
  • there:is- 不好,因为:

更实际的是,如何匹配以下字符串:

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

对于不包含命名空间的 xpath 上的任何节点测试?

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

将匹配节点测试,但包含使其出错的命名空间前缀。

4

5 回答 5

2

我仍然不确定您是否只是想检测 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");
    }
}

希望有帮助!祝你好运。

于 2008-08-14T00:13:24.030 回答
1

匹配:? 我认为这个问题还不够清楚,因为答案很明显:

if(Regex.Match(":", input)) // reject
于 2008-08-13T18:34:59.067 回答
0

我不太了解正则表达式的语法,但你不能这样做:

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

我认为这样的事情不应该有效吗?

于 2008-08-13T18:26:34.167 回答
0

您可能想要 \w 这是一个“单词”字符。从javadocs,它被定义为 [a-zA-Z_0-9],所以如果你也不想要下划线,那可能行不通....

于 2008-08-13T18:36:02.823 回答
0

是的,我的问题不是很清楚。这是一个解决方案,但不是使用正则表达式进行单次传递,而是使用拆分并执行迭代。它也可以,但不那么优雅:

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 );
于 2008-08-13T20:21:08.400 回答