3

基本的に、次のように文字列を分割する必要があります

"one quoted argument" those are separate arguments "but not \"this one\""

結果として引数のリストを取得する

  • 「1 つの引用された引数」
  • それらの
  • それは
  • 分ける
  • 「でも\"これ\"じゃない」

この正規表現"(\"|[^"])*"|[^ ]+はほぼ機能しますが、問題は、正規表現が常に (少なくとも Java では)可能な限り長い文字列に一致しようとすることです。

その結果、引用符で囲まれた引数で開始および終了する文字列に正規表現を適用すると、文字列全体と一致し、各引数のグループは作成されません。

この正規表現、マッチャーパターン、またはそれを処理するものを微調整する方法はありますか?

注:私が使用できる、または類似のものを教えてはいけませGetOptCommandLine.parse
私の懸念は、純粋なJava正規表現に関するものです(可能であれば、しかし私はそれを疑っています...)。

4

4 に答える 4

4

正規表現は常に(少なくともJavaでは)可能な限り長い文字列に一致しようとします。

いいえ。

これは、貪欲な表現を使用するか、貪欲でない表現を使用するかによって制御されます。いくつかの例を参照してください。貪欲でないものを使用する(疑問符を追加する)ことでそれを行う必要があります。それは怠惰な定量化と呼ばれます。

デフォルトは貪欲ですが、それが常にそのようであるという意味ではありません。

于 2012-11-21T14:37:28.330 に答える
4

非貪欲な修飾子を使用し*?て機能させることができます。

"(\\"|[^"])*?"|[^ ]+

実際の例については、次のリンクを参照してください: http://gskinner.com/RegExr/?32srs

于 2012-11-21T14:40:29.947 に答える
2
public static String[] parseCommand( String cmd )
{
    if( cmd == null || cmd.length() == 0 )
    {
        return new String[]
        {};
    }

    cmd = cmd.trim();
    String regExp = "\"(\\\"|[^\"])*?\"|[^ ]+";
    Pattern pattern = Pattern.compile( regExp, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE );
    Matcher matcher = pattern.matcher( cmd );
    List< String > matches = new ArrayList< String >();
    while( matcher.find() ) {
        matches.add( matcher.group() );
    }
    String[] parsedCommand = matches.toArray(new String[] {});
    return parsedCommand;
}
于 2013-08-29T07:23:45.807 に答える
2

私はこれを思いつきました(良い出発点を与えてくれたアレックスに感謝します:))

/**
 * Pattern that is capable of dealing with complex command line quoting and
 * escaping. This can recognize correctly:
 * <ul>
 * <li>"double quoted strings"
 * <li>'single quoted strings'
 * <li>"escaped \"quotes within\" quoted string"
 * <li>C:\paths\like\this or "C:\path like\this"
 * <li>--arguments=like_this or "--args=like this" or '--args=like this' or
 * --args="like this" or --args='like this'
 * <li>quoted\ whitespaces\\t (spaces & tabs)
 * <li>and probably more :)
 * </ul>
 */
private static final Pattern cliCracker = Pattern
    .compile(
       "[^\\s]*\"(\\\\+\"|[^\"])*?\"|[^\\s]*'(\\\\+'|[^'])*?'|(\\\\\\s|[^\\s])+",
       Pattern.MULTILINE);
于 2014-03-18T07:12:57.670 に答える