3

正規表現で「文字列」タイプの関数を実行する最も簡単な方法は何ですか? たとえば、「:? 例えば:

  • 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

「単語」文字である \w が必要になる場合があります。javadocsからは [a-zA-Z_0-9] と定義されているため、アンダースコアも必要ない場合は機能しない可能性があります....

于 2008-08-13T18:36:02.823 に答える
0

私は正規表現の構文をよく知りませんが、できませんでした:

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

そのようなことはうまくいくはずだと思いますか?

于 2008-08-13T18:26:34.167 に答える
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 に答える