2016-08-30 3 views
0

以下のように私は2文字列を持っている:私は= @」パターン文字列パターンを使用した結果が正規表現AND演算子ですか?

"2016/07/19 19:47:46"; 
"Origin (2)"; 

]マークで終わるスペースで開始していないではない取得したい

string str = " 2016/07/19 19:47:46]"; 
string str1 = " Origin (2)]"; 

^[^ \ S] "ですが、AND演算子はわかりません。

string result = Regex.Replace(str, @"^[^\S]", ""); 

ご協力いただければ幸いです。

+1

本当に、_and_演算子はありません。両方の仕様を正規表現に入れるだけで十分です。 – sln

+1

これにはAND演算子は必要ありません。先頭のスペースの後ろで、末尾の ']'の前にすべての文字が必要です。 REを書くのは簡単です。 '" ^。* \ "$" 'のようなもの、エラーと省略は除きます。 'Replace()'は必要ありません。使用している言語とAPIにマッチAPIが何であれ必要です。 – EJP

+0

私はしようとしましたが、 '' ^。* \] $ "'は不可能です – MinhKiyo

答えて

1

BOL でスペースやないEOLにマークされない:

(?m)^(?:\S.*|.*[^\]])$

私はバージョンを推測がある:

(?m)^\S.*[^\]]$

意志別バージョン0文字以上を入力できます。

(?m)^(?!\s).*(?<!\])$

+0

ありがとう、私は確認します – MinhKiyo

1

AND regex演算子の実装が存在します。 TXR言語には、それは(&と表記されています)否定演算子と同様に、~と表記されています。ご覧のように、問題には当てはまりません。むしろ、我々は]で終了していないスペースで始まらない文字列と一致するようにそれを使用することができます:私たちは簡単にリターンを定義

$ txr 
This is the TXR Lisp interactive listener of TXR 147. 
Use the :quit command or type Ctrl-D on empty line to exit. 
1> (defun complete-match (regex string) 
    (= (match-regex string regex) (length string))) 
complete-match 
2> (complete-match #/~ .*&~.*\]/ "") 
t 
3> (complete-match #/~ .*&~.*\]/ "a") 
t 
4> (complete-match #/~ .*&~.*\]/ "abc") 
t 
5> (complete-match #/~ .*&~.*\]/ " abc") 
nil 
6> (complete-match #/~ .*&~.*\]/ "abc]") 
nil 
7> (complete-match #/~ .*&~.*\]/ "]") 
nil 
8> (complete-match #/~ .*&~.*\]/ " ]") 
nil 
9> (complete-match #/~ .*&~.*\]/ " ") 
nil 
10> (complete-match #/~ .*&~.*\]/ "] ") 
t 

complete-match機能をt(true)かnil(偽)入力文字列が正規表現と完全に一致する場合。 (正規表現で指定されたオートマトンは、文字列のすべての文字を処理する際に受け入れ状態になります。) &演算子は優先順位が低いため、(~ .*)&(~.*\])とカッコで括ることができます。これは2つの式のAND結合です。否定演算子~はカテナネーションよりも優先順位が低いため、~abcは「abc以外のものと一致します」を意味します。つまり、[^a]bcを意味するものではありません。したがって、~ .*は、空白で始まらない文字列のセットを示し、~.*\]は、]で終わらない一連の文字列を示します。 (これは正規表現の構文上の特徴であるため、この正規表現の実装ではエスケープする必要があります)。

これらの無効化されたセットには、空の文字列が含まれます。空文字列は空白文字で始まらないので、空文字列は~ .*と一致します。オプションの先頭にスペースをトリミングまたは]後続の問題を解決するために

、我々は単に二つの連続する正規表現の置換を行うことができます。先頭のスペースを削除し、もしあれば、、その後末尾を削除「]」、もしあれば。 "and"ロジックは、連続的な変換ステップに変換されます。これを実行してAを入力してBを生成し、次にBを実行して結果Cを生成します。

文字列の先頭文字が空白で、条件付きで文字列の残りの部分または文字列全体を取るかどうかをテストするだけで済みますので、正規表現は不要です。同様に、テールを扱う:

1> (defun trim-leading-char (str ch) 
     (if (equal [str 0..1] `@ch`) 
     [str 1..:] 
     str)) 
trim-leading-char 
2> (defun trim-trailing-char (str ch) 
     (if (equal [str -1..:] `@ch`) 
     [str 0..-1] 
     str)) 
trim-trailing-char 
3> (trim-leading-char " abc]" #\space) 
"abc]" 
4> (trim-trailing-char " abc]" #\]) 
" abc" 
5> (trim-trailing-char (trim-leading-char " abc]" #\space) #\]) 
"abc" 
+0

あなたの詳細な説明をありがとう、私は多くのことを学びました。 – MinhKiyo

関連する問題