使用正则表达式执行“instring”类型函数的最简单方法是什么?例如,由于存在:
这样的单个字符,我怎么能拒绝整个字符串?例如:
this
- 好的there:is
- 由于:
更实际的是,我如何匹配以下字符串:
//foo/bar/baz[1]/ns:foo2/@attr/text()
对于xpath上不包含命名空间的任何节点测试?
(/)?(/)([^:/]+)
将匹配节点测试,但包含使其失败的命名空间前缀。
答案 0 :(得分: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");
}
}
希望有所帮助!祝你好运。
答案 1 :(得分:1)
匹配:?我认为问题不够明确,因为答案是如此明显:
if(Regex.Match(":", input)) // reject
答案 2 :(得分:0)
我不太了解正则表达式语法,但你不能这样做:
[any alpha numeric]\*:[any alphanumeric]\*
我认为这样的事情应该不起作用?
答案 3 :(得分:0)
你可能想要\ w这是一个“单词”字符。从javadocs开始,它被定义为[a-zA-Z_0-9],所以如果您不想要下划线,那可能无效......
答案 4 :(得分: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 );