2009-07-17 4 views
1

申し訳ありませんが、これはおそらく簡単です。しかし、各行に区切り文字があり、各行の区切り文字の前にあるすべてのテキストを探したい場合は、どのような正規表現を使用しますか?区切り文字が重要かどうかわかりませんが、区切り文字は%文字です。どのようにして、行の最初の文字xまでのすべてのテキストを見つけることができますか?

+0

テキストに関するその他の基準はありますか、%の前ですべてを取得したいだけですか? –

+2

あなたのプロジェクトはどの言語ですか?正規表現_これは最善の方法ではありません。 – beggs

+1

これは本当に正規表現の問題ではありません。あなたはそれらを使うことはできますが、非常に不必要です。 – Tom

答えて

1

あなたのテキストが1

/^(.*?)%/ 

注グループになります。これは、パーセント記号をすべてをキャプチャします。キャプチャするものを制限したい場合は、 escape sequenceをお選びください。

+1

私が言及したように、正規表現はこの問題では必要ありませんが、少なくともそれは正しいものです:-)。 – Tom

+0

質問に答えるだけで、私は同意します:-)ほとんどの言語では、このような簡単な作業の方がずっと簡単です。 –

+0

...あなたの答えがはっきりと示されています。 –

0

したくない場合は正規表現を使用する必要はありません。使用している言語によってはsplit()のような文字列関数があります。

$str = "sometext%some_other_text"; 
$s = explode("%",$str,2); 
print $s[0]; 

これはPHPであり、%で分割され、返された配列の最初の要素を取得します。他の言語でも同様に分割方法で行われます。

+0

これはおそらく大きな問題ではありませんが、 「爆発」は、文字列全体を見る必要があるため、少し不必要です。また、リスト(および余分な文字列オブジェクト)も作成されます。文字列全体を見る必要がないため、部分文字列の概念はより簡単で高速です。 (区切り文字の最初の出現を見つけることは、文字列全体を見る必要はありません)。 – Tom

+0

終わり近くに探している部分文字列はどうなりますか?それも全体の文字列を見ている。 「部分文字列」には2つのステップがあり、1つは索引を、次に2番目は部分文字列を実行することです。どちらの関数も2つの関数を呼び出す必要があります。メモリ(つまり配列)内のアイテムを呼び出すよりも速いですか?あなたが言うことを真実であると私に確信させるために、これらの2つの方法をベンチマークする方法がありますか? :) – ghostdog74

0

Pythonでは、あなたが使用することができます:Javaでは

def GetStuffBeforeDelimeter(str, delim): 
    return str[:str.find(delim)] 

:Cで

public String getStuffBeforeDelimiter(String str, String delim) { 
    return str.substring(0, str.indexOf(delim)); 
} 

++(未テスト):あなたがしたいと思うすべての上記の例で

using namespace std; 
string GetStuffBeforeDelimiter(const string& str, const string& delim) { 
    return str.substr(0, str.find(delim)); 
} 

区切り文字を含まない文字列などのコーナーケースを処理します。

基本的には、文字列全体をスキャンするのを避けることができるため、この単純な方法で部分文字列を使用します。正規表現はオーバーキルであり、文字列全体を見ているため、区切り文字上での「分解」や分割も不要です。

+0

もちろん私は読者に練習としてエラー処理を任せていますが、それは考え方です:-)。 – Tom

+0

部分文字列も全体の文字列を正しく見ますか?インデックスを見つけるためにfind()(Pythonで)またはindexOf(javaで)を使用する必要があります。 – ghostdog74

+0

@ ghostdob74:部分文字列は文字列全体を見る必要はありません。部分文字列の部分だけを見ることができます。また、indexOfまたはfindは、delimeterが最初に出現するまでスキャンしてから停止する必要があります。delimeterが最後に来ないか、文字列にない限り、最後までスキャンしません。 – Tom

0

あなたは正規表現の味を言わないので、私はPerl表記を使用します。通常、それは文字列全体の始まりに過ぎないと一致しますが、この正規表現は複数行モードのおかげで最後に「M」modifierです:

/^[^%]*/m 

最初^

が開始 anchorです。 [^%]は反転された character classで、 '%'を除く任意の1文字に一致します。 *は、 quantifierであり、前のもの(この場合は [^%])を0回以上マッチさせることを意味します。

関連する問題