https://regex101.com/r/sB9wW6/1
(?:(?<=\s)|^)@(\S+)
<-- 肯定的な後読みの問題
prod
:でこのように作業しています(?:\s|^)@(\S+)
が、正しい開始インデックス (スペースなし) が必要です。
JS では次のようになります:
var regex = new RegExp(/(?:(?<=\s)|^)@(\S+)/g);
正規表現の解析エラー: 無効な正規表現: /(?:(?<=\s)|^)@(\S+)/
何が間違っているのでしょうか?
アップデート
OK、JS では後読みは不要です :(
しかし、いずれにせよ、一致の適切な開始インデックスと終了インデックスを取得するには正規表現が必要です。先頭のスペースなしで。
ベストアンサー1
regex101.comでは常に正しい正規表現エンジンを選択してください使用により発生した問題を参照してください[^]
Python の構文を使用した JS のみ互換の正規表現。
JS正規表現 -この質問に答える時点で- 後読みをサポートしていませんでした。現在では、後読みがますます採用されるようになっています。ECMAScript 2018での導入キャプチャ グループを使用できるため、ここで実際には必要ありません。
var re = /(?:\s|^)@(\S+)/g;
var str = 's @vln1\n@vln2\n';
var res = [];
while ((m = re.exec(str)) !== null) {
res.push(m[1]);
}
console.log(res);
は(?:\s|^)@(\S+)
空白または を含む文字列の先頭に一致し(?:\s|^)
、次に に一致し@
、次に に一致します。キャプチャグループ 1 に、 . を含む 1 つ以上の空白以外の文字を追加します(\S+)
。
開始/終了インデックスを取得するには、
var re = /(\s|^)@\S+/g;
var str = 's @vln1\n@vln2\n';
var pos = [];
while ((m = re.exec(str)) !== null) {
pos.push([m.index+m[1].length, m.index+m[0].length]);
}
console.log(pos);
ボーナス
私の正規表現は regex101.com では機能しますが、... では機能しません。
All languages - "Literal string" vs. "String literal" alert
- コードで使用されているのと同じテキストに対してテストするようにしてください。リテラル文字列、正規表現テスターで。よくあるシナリオとしては、文字列リテラル値をテスト文字列フィールドに直接入力します。文字\n
列エスケープシーケンス((改行文字)、\r
(復帰)、\t
(タブ文字)など)はすべて含めます。正規表現検索 C++たとえば、 です。これらは、対応するリテラル文字に置き換える必要があることに注意してください。したがって、Python で がある場合text = "Text\n\n abc"
、正規表現テスターのテキスト フィールドでText
、 、つまり 2 つの改行を使用する必要がありますabc
。Text.*?abc
決してそれに匹敵することはないあなたは「効果がある」と思うかもしれないはい、.
改行文字に必ずしも一致するわけではありません。正規表現で複数の行にわたって任意の文字を一致させるにはどうすればよいですか?All languages - Backslash alert
- バックスラッシュを正しく使用してください文字列リテラルほとんどの言語では、通常の文字列リテラル、二重バックスラッシュを使用します。つまり、\d
regex101.comで使用される場合は と記述する必要があります\\d
。生の文字列リテラルregex101と同様に、単一のバックスラッシュを使用します。エスケープ単語境界これは非常に重要なことです。多くの言語では(C#、パイソン、ジャワ、JavaScript、ルビーなど)は、"\b"
BACKSPACE文字を定義するために使用され、つまり有効な文字列エスケープシーケンスPHP は文字列エスケープ シーケンスをサポートしていない\b
ため、"/\b/"
= を'/\b/'
使用します。All languages - Default flags - Global and Multiline
- デフォルトでは、regex101.com でm
とg
フラグが有効になっていることに注意してください。したがって、^
と を使用する$
と、それぞれ行の先頭と末尾で一致します。コードで同じ動作が必要な場合は、複数行モードの実装方法を確認し、特定のフラグを使用するか、サポートされている場合はインライン(?m)
埋め込み (inline) 修飾子を使用します。g
フラグは複数出現の一致を有効にします。多くの場合、特定の関数/メソッドを使用して実装されます。適切なものを見つけるには、言語リファレンスを確認してください。改行-行末regex101.comの文字列はLFのみで、CRLFで終わる文字列はテストできません。regex101.com VS myserver - 異なる結果解決策は正規表現ライブラリごとに異なります。
\R
(PCRE、Java、Ruby)または何らかの\v
(Boost、PCRE)、、\r?\n
/(?:\r\n?|\n)
((?>\r\n?|\n)
.NETに適しています)、または[\r\n]+
他のライブラリ(C#、PHP の)。
正規表現を複数行の文字列(独立した文字列/行のリストではない)に対してテストすることに関連するもう1つの問題は、パターンが行末、、\n
否定された文字クラスの文字を消費する可能性があることです。そのような問題.\D
は行末文字と一致し、これを回避するには、[^\d\n]
または他の代替手段を使用できます。php
- Unicode文字列を扱っている場合、または短縮文字クラスをUnicode文字にも一致させたい場合(たとえば、または\w+
に一致させたい場合、またはハードスペースに一致させたい場合)、Стрибижев
Stribiżew
\s+
u
修飾子、 見るpreg_match()は正規表現テスターが動作するにもかかわらず0を返す
- すべての出現箇所を一致させるには、preg_match_all
、preg_match
ではなく/...pattern.../g
、参照複数の出現箇所を見つけるための PHP preg_matchそしてPHP で preg_match を使用すると「不明な修飾子 'g' が... にあります」と表示されますか?
- インラインバックリファレンスのような正規表現が\1
機能しませんか?二重引用符で囲まれた文字列リテラルを使用していますか?一重引用符で囲まれたものを使用してください。PHPではバックリファレンスが機能しないphpララベル
- パターンの周囲に正規表現の区切り文字が必要であることに注意してください。https://stackoverflow.com/questions/22430529 を参照してください。パイソン
-re.search
、、、re.match
およびre.fullmatch
は正規表現re.findall
をre.finditer
初め引数と入力弦として2番引数。re.findall("test 200 300", r"\d+")
ではなく ですre.findall(r"\d+", "test 200 300")
。regex101.com でテストする場合は、「コード ジェネレーター」ページを確認してください。
-re.match
文字列の先頭でのみ一致を検索する を使用した場合は、 を使用しますre.search
。正規表現はPythexでは正常に動作しますが、Pythonでは動作しません
- 正規表現にキャプチャグループが含まれている場合は、re.findall
キャプチャ/キャプチャタプルのリストを返します。キャプチャグループを使用しないかre.finditer
、冗長なキャプチャグループを削除します。re.findall の動作がおかしい
-^
パターンで文字列全体の開始ではなく行の開始を示すために使用した場合、または$
文字列ではなく行の終了を示すために使用した場合、メソッドに渡すre.M
かre.MULTILINE
フラグをre
参照してください。Python 正規表現で行頭にマッチさせるために ^ を使用する
- 複数行にわたるテキストを一致させようとし、re.DOTALL
またはre.S
、または[\s\S]*
/ を使用し[\s\S]*?
ても何も機能しない場合は、 などを使用してファイルを行ごとに読み込んでいるかどうかを確認してくださいfor line in file:
。ファイルの内容全体を正規表現メソッドの入力として渡す必要があります。2 つの文字の間にあるすべてのものを新しい行にまたがって取得する.
- 正規表現にフラグを追加して、次のようなことを試してもうまくいかない場合pattern = r"/abc/gi"
は、Python で正規表現に修飾子を追加するにはどうすればいいですか?C# の、。ネット
- .NET正規表現はサポートされていません所有格量指定子++
、、、、、のように*+
??
{1,10}?
所有格量指定子を含むオプションのテキスト間の数字を照合する .NET 正規表現が機能しない
- 複数行の文字列にマッチし、パターン内のアンカーにRegexOptions.Multiline
オプション(またはインライン(?m)
修飾子)を使用してマッチさせる場合$
行全体、コード内で一致しない場合は、\r?
の前にを追加する必要があり$
ます。.Net 正規表現は、複数行が有効になっている場合でも、$ を行末ではなく文字列の末尾と一致させます。
- 取得するため複数の一致、使用しRegex.Matches
ない、Regex.Match
見ない正規表現 文字列内の複数回の一致
- 上記と同様のケース: 二重改行シーケンスによって文字列を段落に分割する -C# / 正規表現パターンはオンラインテストでは機能しますが、実行時には機能しません
- 正規表現の区切り文字を削除する必要があります。つまり、@"/\d+/"
実際には次のようになります@"\d+"
。正規表現区切り文字を含むシンプルでテスト済みのオンライン正規表現は、C# コードでは機能しません。Regex.Escape
-正規表現で不必要にすべての文字をエスケープしていた場合( などRegex.Escape(@"\d+\.\d+")
)、 を削除する必要がありますRegex.Escape
。正規表現は正規表現テスターでは機能しますが、C#では機能しませんダーツはためく
- 生の文字列リテラル、、RegExp(r"\d")
または二重のバックスラッシュ (RegExp("\\d")
) を使用します - https://stackoverflow.com/questions/59085824ジャバスクリプト
RegExp("\\d")
- :内の二重エスケープバックスラッシュRegExp コンストラクターに渡される文字列を二重にエスケープする必要があるのはなぜですか?
- (否定) 後読みはほとんどのブラウザでサポートされていません:正規表現はブラウザでは動作しますが、Node.jsでは動作しません
- 文字列は不変なので、.replace
結果をvarに代入します -.replace() メソッドは文字列をその場で変更します
- 取得全て一致するものstr.match(/pat/g)
-Regex101 と Js 正規表現検索が異なる結果を表示するまたはRegExp#exec
、RegExp.exec を使用して文字列からすべての一致を抽出する正規表現
- 交換する全て文字列内のパターン一致:replace を使用すると、JavaScript はなぜ最初のインスタンスのみを置き換えるのでしょうか?ジャバスクリプト角張った
- 文字列リテラルで正規表現を定義する場合はバックスラッシュを 2 倍にするか、正規表現リテラル表記のみを使用します。https://stackoverflow.com/questions/56097782 を参照してください。ジャワ
- 単語の境界が機能していませんか?二重のバックスラッシュを使用してください"\\b"
。正規表現\b単語境界が機能しない
-invalid escape sequence
例外が発生しましたか? 同じこと、二重のバックスラッシュです -Java は正規表現 \s では動作しません。無効なエスケープ シーケンスですと表示されます。
- がNo match found
あなたを悩ませていますか? 実行Matcher.find()
/Matcher.matches()
-私の正規表現は RegexPlanet と regex101 では機能するのに、私のコードでは機能しないのはなぜですか?
-.matches()
完全な文字列一致が必要な場合は、次を使用します.find()
:どのオンラインテスターでも一致するが、Eclipse では一致しない Java 正規表現パターン
- 次の方法でグループにアクセスしますmatcher.group(x)
:正規表現はJavaでは機能するが、他の方法では機能しない
- 文字クラス内では、[
との両方]
をエスケープする必要があります -Java 正規表現の文字クラス内で角括弧を使用するmatcher.matches()
-とをmatcher.find()
連続して実行しないでください。if (matcher.matches()) {...}
パターンが文字列全体に一致するかどうかを確認し、それに応じて動作する場合にのみ使用してください。または、if (matcher.find())
単一の一致があるかどうか、またはwhile (matcher.find())
複数の一致(またはMatcher#results()
)。 見る私の正規表現は RegexPlanet と regex101 では機能するのに、私のコードでは機能しないのはなぜですか?スカラ
- 正規表現は複数の行に一致しようとしますが、ファイルを1行ずつ読み込んでいます(例: を使用for (line <- fSource.getLines)
)。それを1つの変数に読み込みます(ファイルから読み込むときに、Scala 正規表現で新しい行に一致する)コトリン
-Regex("/^\\d+$/")
外側のスラッシュを削除してください。正規表現の区切り文字パターンの一部ではない。Kotlin で正規表現を使用して文字列内の 1 つ以上の単語を検索する
- 部分的な文字列一致を期待しているが、.matchEntire
完全な文字列一致が必要な場合は、 を使用して.find
ください。Kotlin では正規表現が一致しないモンゴDB
/.../
-一重引用符/二重引用符で囲まないでください。mongodb正規表現が機能しないC++ の
-regex_match
完全な文字列一致が必要です。regex_search
部分一致を検索する場合に使用します -C++ regex_match で正規表現が期待どおりに動作しない
-regex_search
最初の一致のみを検索します。sregex_token_iterator
またはsregex_iterator
を使用してすべての一致を取得します。std::match_results::size は何を返しますか?
- を使用してユーザー定義の文字列を読み取る場合std::string input; std::cin >> input;
、 はcin
最初の空白文字までしか読み取らないことに注意してください。行全体を適切に読み取るには、std::getline(std::cin, input);
- を使用します。'+' 量指定子に一致する C++ 正規表現
- が"\d"
機能しない場合は、"\\d"
またはR"(\d)"
(を使用する必要があります生の文字列リテラル) -この正規表現はC++では機能しません
- 正規表現が文字列リテラルではなくリテラルテキストに対してテストされていることを確認してください。正規表現検索 C++行く
- 二重のバックスラッシュまたは生の文字列リテラルを使用します:Goでは正規表現が機能しないGo
- Go regex は lookaround をサポートしていません。テストする前に regex101.com で適切なオプション ( ) を選択してください。正規表現の否定セットが機能しない Golangグルーヴィー
- 一致するものをすべて返す:regex101 で動作する正規表現は Groovy では動作しませんr
- 文字列リテラル内のバックスラッシュを二重にエスケープします。grep で「'\w' は認識されないエスケープです」
-perl=TRUE
PCREエンジン((g)sub
/(g)regexpr
)に使用します。この lookbehind を使用する正規表現が R では無効なのはなぜですか?オラクル
- すべての量指定子の貪欲性は正規表現の最初の量指定子によって設定されます。Regex101 と Oracle Regex(その後、すべての量指定子を最初の量指定子と同じくらい貪欲にする必要があります)]
-\b
動作しませんか?Oracle正規表現は単語境界をまったくサポートしていません。次に示す回避策を使用してください。正規表現のマッチングは正規表現テスターでは機能しますが、Oracleでは機能しませんファイアベース
^
- 二重エスケープのバックスラッシュは、パターンの先頭にのみ表示され、末尾(ある場合)にのみ配置されていることを確認してください$
。また、インラインバック参照は 9 個以上使用できないことに注意してください。Firebase ルール 正規表現 誕生日ファイアベースgoogle-cloud-firestore
- Firestore セキュリティ ルールでは、正規表現を文字列として渡す必要があります。つまり、/
記号で囲んではいけません。つまり、allow create: if docId.matches("^\\d+$")
... を使用します。https://stackoverflow.com/questions/63243300 を参照してください。Google データ スタジオ
-/pattern/g
には正規表現の区切り文字やフラグ( など)REGEXP_REPLACE
が含まれていてはならない- 参照/
g
正規表現を使用して、Google Data Studio の日付フィールドから角括弧を置き換える方法を教えてください。Google スプレッドシート
- が完全な一致を返さず、結果を切り捨てていると思われる場合は、正規表現に冗長なキャプチャグループが含まれていないか確認して削除するか、開始後にREGEXEXTRACT
を追加してキャプチャグループを非キャプチャグループに変換する必要があります。?:
(
Google スプレッドシートで URL ドメイン ルートを抽出する単語境界pcrephp
-これら[[:<:]]
は[[:>:]]
PCRE では有効な構造ですが、正規表現テスターでは機能しません。https://stackoverflow.com/questions/48670105 を参照してください。スノーフレーククラウドデータプラットフォーム スノーフレークSQL- ストアドプロシージャを書いていて、
\\d
動作しない場合は、再度それらを2倍にして使用する必要があります\\\\d
。RLIKE を使用した Snowflake ストアド プロシージャでの VARCHAR 値から DATE 値への REGEX 変換が一貫していない.
-\d
正規表現パターンは文字列リテラル内で定義する必要があります'\\d'
。文字列リテラルにはエスケープシーケンスを含める方法が必要です。Snowflake の正規表現 - 文字列で始まり数字で終わる。