文字列の否定の正規表現
次のような「File」の前の文字列を大文字に置き換えるという文で
「common」という文字列だけはそのまま置き換えないようにしたいのですが、
$string = "commonFile aaFile";
$pattern = '/(\w+)(?![common])(File)/e';
$replacement="ucwords('\\1')";
$string = preg_replace($pattern, $replacement, $string);
print htmlspecialchars($string); //Common Aa と表示される
このやり方だと「\w+」が効いてるせいなのか先読み否定の「?![common]」が効いてくれません・・・
$pattern = '/(aa)(?![common])(File)/e';
print htmlspecialchars($string); //commonFile Aa と理想とする結果が表示される
と具体的な文字列だと要求どおりになるのですが、
そうではなくて「File」の前が「common」の時だけ無視して欲しいのです。
どのように記述すれば良いのでしょうか?
No.4ベストアンサー
- 回答日時:
#1の回答でも触れられてますが
>このやり方だと「\w+」が効いてるせいなのか先読み否定の「?![common]」が効いてくれません
commonを囲む[ ] はどういった意図でつけているのでしょうか?
common が続かないという先読みなら (?!common) になります。
もっともそこを直しても質問者さんの意図通りには動作しませんけど。
commonFile は commonFile のままにしておきたいけど、uncommonFile はUncommonに
したいといったことであるなら、#3の回答をちょっといじった
$pattern = '/(\w+(?<!common))(File)/e';
$replacement="ucwords('\\1')";
あたりでしょうか。
どうしても「先読み」でということなら
\b(?!common)(\w+)(File)
といった感じかと。
ご回答ありがとうございます。
そのやり方でできました。ありがとうございます。
>commonを囲む[ ] はどういった意図でつけているのでしょうか?
実は自分でもよく分からず、他の参考になるサイトなどで囲んでいたので
そのまま真似していました・・・
それと関連するかもしれないのですが、
'/(\w+(?<!common))(File)/e';
は
'/(\w+(?<!common))File/e';
の「File」の()なしでも成功するのですが、
自分で付けといて質問するのもあれですが、
()がある場合とない場合ではどう違うのでしょうか?
()があった方がいいのでしょうか?
No.5
- 回答日時:
>>commonを囲む[ ] はどういった意図でつけているのでしょうか?
>実は自分でもよく分からず、他の参考になるサイトなどで囲んでいたので
んー、質問者さんが何か勘違いされていたか、そのサイトの記述が
怪しい気もします。
> それと関連するかもしれないのですが、
> '/(\w+(?<!common))(File)/e';
> は
> '/(\w+(?<!common))File/e';
> の「File」の()なしでも成功するのですが、
> 自分で付けといて質問するのもあれですが、
>()がある場合とない場合ではどう違うのでしょうか?
>()があった方がいいのでしょうか?
今回の場合は、File は( ) で囲む必要はありません。
( ) の目的は大きく二つあって、ひとつは
(common)* (common)+ のように、繰り返しの対象を大きくしたい場合です。
これを単に common* としてしまうと commonnnnn のように、最後のnだけが
繰り返しの対象になってしまいます。
もうひとつは後方参照 (back reference) で使うための記録です。
今回の例で言うと、(\w+(?<!common)) が \1 (記述上は\\1) として置換のときに
使われています。
Fileのほうはというと、そのどちらにも当てはまらないのであってもなくても
結果が変わらないのです。細かい話をすると余計に ( ) をつけて回ると
処理速度が低下するのですが、あまり神経質になる必要はありません。
とこんな感じの説明でいかがでしょうか?
ご回答ありがとうございます。
なるほど、自分もなんとなく()があってもなくても
そんなにたいしたことじゃないだろうなぁという気がしていたのですが、
役割が分かってこれですっきりしました。
No.3
- 回答日時:
$pattern = '/\w+(?<!common)(?=File)/e';
$replacement="ucwords('\\0')";
何か足りない気がするけどまぁいいか。
ご回答ありがとうございます。
このやり方だと、
//commonFile AaFile
とAaにもFileが残ってしまいますが
//commonFile Aa
とcommon以外はFileはなくしたいです。
No.2
- 回答日時:
たとえば抜き出したあとにチェックするとか?
<?
$string = "commonFile aaFile";
$pattern = '/(\w+)(File)/e';
$replacement="('\\1'=='common')?'\\1':ucwords('\\1')";
$string = preg_replace($pattern, $replacement, $string);
print htmlspecialchars($string); //common Aa と表示される
?>
ご回答ありがとうございます。
なるほど、(正しい言い方かわかりませんが)正規表現以外の部分で
処理してしまおうということどね。
たしかにこのやり方なら、使い慣れてる分自由にできそうですね。
ところで正規表現の分野において文字列の否定については、
あまり取り扱ってないというか(なんとなくですが)消極的な気がするのですが
何か理由みたいなのはあるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Perl perlについての質問 2 2022/10/17 15:25
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- その他(プログラミング・Web制作) テキストエディタで複数行にわたる文字列の行頭に番号を振る方法 4 2023/03/11 12:57
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Visual Basic(VBA) Excel VBAでAA(BBB) → BBB.AA に置換したい 2 2022/10/30 13:59
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- その他(コンピューター・テクノロジー) 正規表現の置換で一部の文字列をそのまま残したい 2 2022/05/03 19:19
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
REGEXREPLACE関数について、
-
どなたか私のPHP文章を添削して...
-
nl2brが効かないのですが・・・
-
置換の内容をランダムにしたい...
-
2バイトローマ数字小文字につ...
-
phpについて教えてほしいです
-
文字列の否定の正規表現
-
特定の文字を含む文字列の条件...
-
VBAのコマンドボタンの文字列の...
-
文字の入力で横バー上段、中断...
-
PHPの正規表現で住所を分けるに...
-
エクセルの文字列の抽出方法に...
-
PHPの正規表現の/(?<!\\\\\\),/...
-
エスケープ文字の復帰(¥r)と...
-
fgetsとsscanf
-
PHPで出力したHTMLのソースが汚い
-
HTML5の「pattern」属性で前後...
-
全角括弧と全角読点の間隔を狭...
-
preg_match_all 複数の文字列を...
-
テキストファイルから1文字ず...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルコーテーション(
-
REGEXREPLACE関数について、
-
VBSで"をエスケープする文字は?
-
文字列の置換をCStringで(C++)
-
PHPの¥
-
○分から○時間○分に変換
-
ダブルクォーテーションが置換...
-
文字列の括弧について(初心者)
-
Smartyで携帯絵文字を表示する方法
-
php 正規表現で、\\マークを取...
-
PHP・Wordpress preg_replaceを...
-
文字列のアスタリスク置換
-
nl2brが効かないのですが・・・
-
独自タグに囲まれた文字列の変換
-
ダブルクオーテーション
-
入力文字に\\マークが入ってい...
-
空白文字のカンマへの変換について
-
上手い置換方法は?
-
どなたか私のPHP文章を添削して...
-
2バイトローマ数字小文字につ...
おすすめ情報