ホーム>source

私は正規表現で次のコードを持っています

CHARACTER <- ^([A-Z0-9 .])+(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$
str_match("WILL (V.O.)",CHARACTER)[1,2]

これは「WILL」の値と一致するはずだと思っていましたが、空白を返しています。 別の言語でRegExを試しましたが、その場合もグループは空に戻ります。

値 "WILL"のみを取得するために、この正規表現に何を追加する必要がありますか?

あなたの答え
  • 解決した方法 # 1

    + を配置して、繰り返しキャプチャグループを形成しました  グループの外。元に戻す:

    CHARACTER <- "^([A-Z0-9 .]+)(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$"
                              ^
    
    

    Will をトリミングできます。   \s* で遅延マッチを使用する場合  グループの後:

    CHARACTER <- "^([A-Z0-9\\s.]+?)\\s*(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$"
    
    

    この正規表現のデモをご覧ください。

    > library(stringr)
    > CHARACTER <- "^([A-Z0-9\\s.]+?)\\s*(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$"
    > str_match("WILL (V.O.)",CHARACTER)[1,2]
    [1] "WILL"
    
    

    あるいは、あなたはただエキス  Will  と

    > str_extract("WILL (V.O.)", "^.*?(?=\\s*(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$)")
    [1] "WILL"
    
    

    または、ベースRと同じ:

    > regmatches(x, regexpr("^.*?(?=\\s*(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$)", x, perl=TRUE))
    [1] "WILL"
    
    

    ここに、

    ^  -文字列の先頭に一致

    .*?  -改行文字以外の0+文字

    (?=\\s*(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$)  -現在の場所のすぐ右側にあることを確認します

    \\s*  -0個以上の空白

    (?:\\(V\\.O\\.\\))?  -オプションの (V.O.)  部分文字列

    (?:\\(O\\.S\\.\\))?  -オプションの (O.S.)  部分文字列

    (?:\\(CONT'D\\))?  -オプションの (CONT'D)  部分文字列

    $  -文字列の終わり。

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ アセンブリ論理シフト左ソリッドは機能しません