はてなキーワード: 角括弧とは
LaTeXで、縦書き人文書のように全角括弧内()の級数下げをするマクロを書いた。
・「(」が来ると級数下げる
・「)」が来ると級数上る
・「()」のなかに入れ子の「()」が来た場合は、変更しない(本づくりのお作法)
※ 「(」と「)」が対応してないと級数下げたまま、になってしまう可能性があるので、ちゃんと合わせておくこと
\usepackage{relsize}\usepackage{newunicodechar}\newif\iffoot\footfalse\newcounter{parnest}\setcounter{parnest}{0}%()内の級数下げマクロ:変数の準備(級数下げしたくない箇所は、()の前後を\foottrue~\footfalseで括ること)
\let\origfootnotetext\footnotetext\renewcommand{\footnotetext}[2][]{\ifx\relax#1\relax \origfootnotetext{\foottrue #2 \footfalse}\else\origfootnotetext[#1]{\foottrue #2 \footfalse}\fi}\let\origfootnote\footnote\renewcommand{\footnote}[1]{\ifnum\ltjgetparameter{direction}=3\origfootnote{\foottrue #1 \footfalse}\else\origfootnote{\foottrue #1 \footfalse}\fi}%脚注コマンドを変更
\let\origendnotetext\endnotetext\renewcommand{\endnotetext}[2][]{\ifx\relax#1\relax \origendnotetext{\foottrue #2 \footfalse}\else\origendnotetext[#1]{\foottrue #2 \footfalse}\fi}\let\origendnote\endnote\renewcommand{\endnote}[1]{\ifnum\ltjgetparameter{direction}=3\origendnote{\foottrue #1 \footfalse}\else\origendnote{\foottrue #1 \footfalse}\fi}%文末脚注コマンドを変更
\makeatletter\chardef\my@J@kakkostart="FF08\newunicodechar{(}{\iffoot\my@J@kakkostart\else\addtocounter{parnest}{1}\ifnum\value{parnest}=1 \relsize{-0.5}\my@J@kakkostart\else\my@J@kakkostart\fi\fi}\makeatother%開くカッコは脚注外では級数下げ
\makeatletter\chardef\my@J@kakkoend="FF09\newunicodechar{)}{\iffoot\my@J@kakkoend\else\addtocounter{parnest}{-1}\ifnum\value{parnest}=0 \my@J@kakkoend\relsize{0.5}\else\my@J@kakkoend\fi\fi}\makeatother%閉じるカッコは脚注外では級数上げ(元に戻す)
Changelogを入れたら末尾が切れてしまった…Changelogはリプにします。https://anond.hatelabo.jp/20220308162009
--
https://twitter.com/igorsushko/status/1500301348780199937
最初はTwitterに流しましたが(https://twitter.com/Vorspiel2/status/1500677825044819971)、誤訳を修正し、追加情報を入れて清書しました。
なお、この文書の真正性について、まずこちらの評価をご参照ください。(イギリスの情報サイトBellingcatの幹部Christo Grozev氏による)
https://twitter.com/christogrozev/status/1500196510054637569
以下はその翻訳です。
昨晩[日本時間3/5早朝]、FSBの内部告発文書と称するものが公開された。そこには、ロシア軍のウクライナでの失敗と、今後数週間~数ヶ月におけるロシアの惨状の予測が記されていた。これが本物かは分からない—ウクライナは以前に、心理戦の一環として偽のFSB文書をリークしたことがある。
だがこれはそれとは違うようだ: 情報源は信頼できるもので(gulagu.netの創始者)、偽造にしては遥かに長い文書だ(長くなるほどボロが出やすくなる)。
私はこの文書を、知己のFSB職員2人(現職または前職)に見せた。2人とも、これは間違いなく同僚が書いたものだと判断した。彼等は結論のすべてには同意しなかったが、それはさておき。
文書はこちら。一読の価値がある: https://www.facebook.com/vladimir.osechkin/posts/4811633942268327
内部告発というのが仮に真であったとしても、内容に虚偽が含まれている可能性にご注意ください。
更に、私はロシア語は分からないので、露→英訳時に意図的か否かを問わず誤情報が紛れ込んでいる場合にはそのままになります。この点について、ロシア語が理解できる方はチェックをお願いします。
以下本文です。
--
[冒頭は英訳者Igor Sushko氏のコメント。氏はウクライナ出身・アメリカ育ちのレーシングドライバー]
以下は、現職のFSB分析官による、ロシアの現状分析を英訳したものである。長いスレッドになるので心して読んでいただきたい。シェア歓迎。全文で2000語以上になる。カーテンの裏で起きていることに対する高度な洞察であり、幅広い題材を含む。
文意を明確にするための補足を、必要に応じて括弧書きで加えている。[日本語訳時に、追加の補足を角括弧書きで入れている。] では始めよう:
最近はろくに眠れていない。ほぼ24時間勤務で、頭に靄が掛かったような状態だ。過労なのだろうが、まるでシュールな世界の住人になったような気分だ。
パンドラの箱は開いた—本当の世界規模の惨劇は今夏までに始まるだろう—全世界の飢餓は避けられない。ロシアとウクライナは小麦の主要産地なのだから。(コメント: 世界規模の飢餓が起きるという予測には同意しない。)
我が国の指導者層に本作戦(ウクライナ侵攻)を決断させたのが何かは分からないが、彼等は揃って我々(FSB)の責任だとしている。我々の分析は非難され、もっと沢山報告を出すよう、最近はますます圧力を掛けられている。
こういう政治コンサルタント、政治家、権力者ども全員が混乱の元凶だ。何より重要なのは、誰もこんな戦争が起きるとは知らなかったということだ—開戦は誰に対しても秘匿されていた。
一例を挙げる— ロシアに対する隕石攻撃(コメント: 西側諸国による制裁を指すと思われる)[これは露→英訳時のミスと思われる。詳細はhttps://anond.hatelabo.jp/20220322231355を参照]があった場合の結果と影響の分析依頼があったとしよう—
そこで攻撃のモードを分析するが、一方これはあくまで仮説であって細部を強調するな、とのお達しがくる。なるほどこのレポートはどこぞの官僚がチェックリストとして使うもので、分析結果はロシアにとってポジティブなものでなくてはならない、
そうでなければ「仕事ができていない」と詰問されるんだな、と理解する。したがって、我々にはどんな攻撃にも対抗手段が揃っている、という結論を出さざるをえない。もう完全にやりすぎだ。
ところが、蓋を開けてみればこれが仮説ではなく現実に起こっており、こんな仮説に基づいた分析など全くのゴミ屑になってしまった。制裁に対抗できていないのはこのためだ。こんな戦争が起きることは誰も知らず、従って制裁への対抗策も準備していなかったのだから。
これは秘密主義と裏表だ—誰もが知らされていないのなら、準備のしようがあるだろうか?
カディロフは激おこだ。ウクライナが「FSBからキーウのチェチェン部隊の情報をもらった」と吹聴したことで、我々(FSB)と連中は一触即発になりかけた。
カディロフの部隊は戦闘に入る機会すらなく壊滅し霧消した。FSBからウクライナへのリークがあったという情報を私は持っていないので、推測するにその可能性は1-2%だろう—とはいえ、可能性を完全に排除できるものではない。
我々の電撃戦は完全に失敗した。そもそもが完遂できないタスクだ: ゼレンスキーと部下を開戦3日で確保し、主要な建物をすべて占拠し、城下の盟を誓わせたとしたら、
ウクライナの抵抗は最小限に抑えられただろう。理屈上は。だがそれがどうした? こんな「理想的な」展開であってさえ、解決不能な問題が残っている: 我々は誰と交渉する気だ?
ゼレンスキーは排除するとして、よろしい、では合意に署名するのは誰だ? ゼレンスキーが署名するなら、彼の排除後は合意は役立たずだ。ОПЗЖ(ウクライナの親露派野党)は協力を拒否している。
臆病者のメドヴェドシュク[実業家。プーチンの友人]は逃亡。指導者は他にもいるが—ボイコ[野党党首]は拒否、彼の支持者も理解しないだろう。ツァリョーフ[DPR・LPR議会議長]を呼び戻そうにも、ロシア国内ですら不評。ヤヌコーヴィチ[前大統領]を戻す? どうやって?
占領は不可能、ということになれば、我等の撤退後、[ウクライナ]新政府は10分ももたずに倒されるだろう。
占領するにしても、必要な人員がどこにいるというのか? 司令部、軍警察、防諜、諜報—ウクライナ人の抵抗を抑え込んだとしても、50万人は要る。これに更に補給と兵站が加わる。
こんなのは決まりきったことだ—質の悪いリーダーシップを量で補おうとするなら、何もかも分が悪くなる。繰り返すが、これは「理想的なシナリオ」での話だ。現実はそうではない。
それでどうなっているのか? 総動員を掛けることはできない。理由は2つ:
1)総動員を掛けたらロシアの国内問題で自壊する: 政治でも経済でも社会でも。
2)我々の兵站は今日ですら伸びきっている。これだけ巨大な分遣隊をウクライナに送り込めたとして、何が得られる? ウクライナ—広大な国土を持ち、我々に向けられる敵意は半端ない国において。
我々の道路はこんな大部隊の補給に耐えうるようできていないから、何もかもがストップするだろう。現在の混乱状況を鑑みれば、指導者層がどうにかできるものでもない。
この2つの理由が同時に存在している。どちらか一方でも、失敗には十分だというのに。
ロシア軍の損失について: 実数は分からない—誰にも。開戦から2日間は何がしかの情報が入ってきたが、今となってはウクライナで何が起きているのか誰も把握していない。主要師団との連絡は途絶えている。(!!)
通信は回復するかもしれないし、攻撃を受けて散開しているかもしれない。司令官ですら戦死者数・負傷者数・捕虜数を把握できていない。戦死者の合計数は千人単位だろう。1万人か、5千人か、2千人ですんでいるか。
こんなことすら、司令部の誰も知らない。もしかしたらロシア兵の戦死者は1万人近くかもしれない。しかもここにはDNRとLNRの戦死者は含んでいない。
ゼレンスキーを殺害ないし捕縛したとしても、状況は変わらない。我々に向けられる敵意はチェチェンのそれ並だ。今となっては、ウクライナの親露派ですら公然と我々に反抗している。
それもこれも、(ロシアの)トップがすべて決めたから。こんなシナリオ(ウクライナ侵攻)など、先制攻撃を受けない限り起こらないと聞かされてきたから。
我々が脅威を高めていくのは、戦闘によらず交渉で結果を出すために必要と聞かされていたから。ウクライナ国内でのゼレンスキー批判の準備も、ウクライナ侵攻など考慮にも入れていなかったから。
今日、ウクライナ市民の死者数は幾何的に増加しており、抵抗は強くなる一方である。歩兵部隊は都市侵入を試みているが—落下傘部隊20隊のうち、わずか1隊が「暫定的に」成功を納めたのみ。
モスル侵攻を思い出してほしい。まるで同じだ—どの国でも起こることで、何も新しいことなどない。ここ数十年のヨーロッパでは—セルビアが一番良い例だろう—都市を包囲しても数年は持ち堪えられる。ヨーロッパからウクライナへの人道的支援が始まるのも時間の問題だ。
我々のひとまずの期限は6月だ。というのは、6月になったらロシアには経済というものが無くなるからだ—何にも残らない。
大局的には、来週には(ロシアで)(戦争賛成派対反対派の)両者の一方が崩れるだろう。こんな(ロシア国内の)緊張状態は長続きできない、というだけのことだ。
分析のしようもなく、混乱状態で予測の立てようもなく、何が起きるか確度を持って言える人間など(ロシアには)誰もいない。
直感に従って、しかも強い感情に動かされて行動するなどというのは最早ポーカーではない。だが賭け金は釣り上がってしまい、どれかしらの手段はうまく行くだろうという望みに掛けるしかない。悲しいけれど、人間は往々にして計算違いを起こすし、そうなればすべてを失うことになる。
見渡してみれば、ロシアにはアウト[ポーカーにおいて「これを引けば勝てる」というカード。「勝ちの目」]が無い。勝ち筋などなく、どうやっても負けるしかない—ということだ。(ここで一旦中断。小休止後に再開する)
(ここから後半。こちらはもっと興味深く、ラストには喜ばしい方向で驚くべきことが記されている)
我々は前世紀の失敗を100%なぞっている。「弱っちい」日本を蹴散らして瞬く間に勝利するつもりが、実は我々の軍はずたぼろだった。[日露戦争]
その後、また勝ちを目指して戦争[第一次世界大戦]をおっ始め、軍隊再教育のためにボリシェヴィキの徴兵を始めた。当時よく知られていなかったボリシェヴィキは戦争反対のスローガンを掲げ、ああいった行動に出た…
プラスの面も見よう: 懲罰部隊を前線に送り込むなんてことは考えもしないよう、我々は手段を尽くした。政治犯や社会不適合者を徴兵したら、前線の士気は下がるだけだ。
敵軍(ウクライナ)の戦意は高い。恐ろしく高まっている。戦い方をよく知っているし、有能な指揮官も多数居る。武器も補給もある。世界的な人道破局の舞台を整えているようなものだ。
我々が最も恐れていることは: 首脳が古くからの問題を新しい問題で糊塗しようとしていることだ。ドンバスで2014年に起きたことの大きな理由がこれだ—我々は西側諸国をクリミアの「ロシアの春」から引き剥がす必要があった。それで、いわゆるドンバス危機を演出し、西側の注意を逸らして
交渉材料にするしかなかった。だがそれで問題はさらに大きくなった。そこでエルドアンに圧力を掛けてサウス・ストリーム(ガスパイプライン)を4本引かせた上で、シリアに侵攻した。
ソレイマニ(イスラム革命防衛隊)が自分側の問題を解決するために、わざと偽情報を我々に流したために起きたことだ。その結果、クリミアの問題は片付けられず、ドンバスの問題も無くなっていない。
サウス・ストリームは(ガスパイプライン)2本に減らされ、シリアは宙吊り状態だ—我々が撤退すればアサド政権は倒され我々は無能扱いされるが、我々が駐留し続けるのも困難だし意味もない。
こんな「ウクライナ電撃戦」を誰が思い付いたのかは知らない。もし仮に我々が正しいインプットを受け取っていれば、少なくとも初期の計画には疑問点があり、大部分を再評価するよう指摘できただろう。それはもう大量に。
それが今や、我々はクソみたいな(PGな言葉遣いは英訳者による)ハマリ状態で、どうしたら良いかも分からない。「非ナチ化」「非武装化」というのは分析のカテゴリには無い。というのも、具体的に数値化されたパラメタが無く、目的達成を何をもって評価できるのか分からない。
今や我々は、頭のおかしい参謀がトップにヨーロッパとの紛争を決断させるのをただ待つだけだ。要求は制裁の緩和だ—制裁を弱めるか、それとも戦争か。
西側が拒絶したら? その場合、本物の国際紛争に巻き込まれる可能性も否定しない。1939年のヒトラー同様に。我々の「Z」[紀章]は鉤十字同様に扱われるだろう。
(ウクライナでの)局地的な核攻撃はありうるか? イエス。但し軍事目的ではない。こんな兵器は防御を崩す役には立たない。使うなら目的は我々以外(西側諸国)の恫喝だ。
我々はウクライナに全責任をおっ被せるシナリオの土壌を作っている。ナルイシキン(ロシア対外情報庁官)と配下のSVRは、ウクライナが密かに核兵器を製造していた、という証明をせっせとこさえている。クソったれ。
連中は、我々がとっくに分析し放棄した論を押し通そうとしている: [核兵器開発の]専門家やウランがあったことの証拠や証明など、でっち上げることは不可能だ。ウクライナには劣化同位体238[ウラン238。劣化ウラン]が1トンある—だが問題にはならない。核燃料サイクル上、作り出すことを秘密にはできない。
「汚い爆弾」にしても秘密裏に製造することはできない。ウクライナの古い原発では、それに必要な物質は副産物として最小限産出されるのみだ。アメリカはMAGATE[IAEAのロシア語表記]と共にこういう施設を監視しているから、こんな論など出したら馬鹿にされるだけだ。
1週間後には何が起きているだろうか? 2週間後でもよい。我々はドツボにハマり、古き良き、空腹の90年代を思い出すことになるだろう。
市場が閉じつつあるのに対抗して、ナビウリナ[ロシア連邦中央銀行総裁]は正しい措置を講じているようではあるが、所詮は船に空いた穴を指で塞ぐようなものだ。状況はどのみちどんどん悪化し続ける。3日とか5日とか7日、などのうちには最早解決しない。
カディロフが地団駄を踏んでいるのも故ないことではない。彼等には彼等の野心がある。彼は「無敵」として名をあげた—もし失敗したなら、自分の部下達に引き摺り下ろされることになる。
それからシリア。「諸君—耐えろ、ウクライナは片づける、そうしたら我らのシリアでの地位を強化する。」実際のところ、ロシアの分遣隊はいつ補給が切れるかも分からず、その後には熱波が待っている…
トルコは海峡を封鎖したし、シリアに物資を空輸するのはかまどに金をくべるようなものだ。しかもだ—これはすべて並行して起こっている。ひとまとめにして分析する時間すら無い。
我々の現状は1943-1944年のドイツのようなものだ—だがこれはウクライナでの「初期状態」にすぎない。
過労でくらくらするし、これは夢で、実は以前と何も変わっていないのではないかと思うことすらある。
監獄について—今後も悪化するだろう。ナットは血が滲むまで締め付けられるだろう。どこでも。有り体に言って、純粋にテクニカルな観点では、現状をコントロールし続けるにはこの手しかない。
我々は既に総動員体制だ。だがこんな体制は長く続けられない。タイムテーブルがどうなっているのかは分からないが、状況は悪化の一途だ。国家統治というのものは、総動員を掛けたら狂い始めるものと決まっている。しかもだ: 100mを疾走できるとして—それをマラソンでやったらどうなるか。
で、ウクライナ問題について100m競走よろしく飛び出したものの、よく見たら参加登録したのはマラソンだった、ということだ。しかもこれは、現状のかなり簡潔な要約でしかない。
更に皮肉なことを言えば、私はプーチンが核の赤ボタンを押して世界を終わらせるとは信じていない。
まず、それを決められるのは1人ではない。誰かが反対するだろう。このプロセスには多数の人間が関与している。「赤」ボタンを1個押すだけ、というものではない。
経験的に知られているとおり、制御構造に透明性があるほど、問題点は見つけやすい。誰が何をどうコントロールしているか混沌としているにも関わらず、虚勢を張った報告ばかりが飛び交う状況にこそ、問題が潜んでいるのが常である。
「赤ボタン」システムが言われているとおりに稼働するかは確信が持てない。それに、プルトニウム燃料は10年毎の交換が必要だ。
3つ目、これが最も唾棄すべきで悲しいことだが、私個人の信念として、側近や忠臣すら近づかせないようになったプーチンが、自分自身を犠牲にするなどとは思えない。
プーチンが恐れているのがCOVIDなのか暗殺なのかはどうでもいい。もしプーチンが、自分が最も信頼していた人々すら恐れているのだとしたら、自分自身と最愛の人々を破壊するなんてことができるものかね? (英訳終)
「はじめての正規表現」がホッテントリ入りしていますが、
導入としては、何に使うのかがわかりやすくて良いのではないかと思います。
あれを見て、基本機能をまとめてみたくなったので、正規表現の基本的な機能について書いてみます。
(正規表現が初めてという人は「はじめての正規表現」を先に見たほうがいいと思います。)
例では「検索」か「置換」をするものとして話を進めていきます。
(「はじめての正規表現」が実例を中心にしたのに対して、こちらは機能を中心に書きます)
正規表現は、プログラミング言語やその他のツールなど、それぞれで微妙な違い(方言)があるので、その点には注意が必要です。
(表記法が違ったり、ここに紹介する機能がサポートされていなかったり、逆に紹介していない機能をサポートしていたりする場合があります)
メタ文字とは機能を持つ文字で、『.
』『*
』『*?
』といったものが当てはまります。
リテラル文字は「文字それ自体」と解釈される文字で、『
』『a
』『<
』といったものです。
「検索する文字列:『egg
』 置換する文字列:『chicken
』」
などとすれば、正規表現を使わない置換と同じ効果になります。
なお、検索して検索文字列が当てはまることを「マッチする」と言います。
メタ文字に使われている文字を検索したい場合は、直前に『\
』を置きます。(これを「エスケープ」と呼びます。)
『.*?^$()[]{}
』などがメタ文字です。
『$100
』を検索したければ、『\$100
』とすればいいということになります。
(『\
』は環境によって、半角の『¥』『\』のどちらかになります。)
言語、ツール、モードなどによっては『@/#
』もエスケープが必要です。
また、『\
』自体は常にエスケープが必要です。
メタ文字 | 意味 |
---|---|
? | 直前の文字を0回または1回繰り返す |
* | 直前の文字を0回以上繰り返す |
+ | 直前の文字を1回以上繰り返す |
{n} | 直前の文字をn回繰り返す |
{n,} | 直前の文字をn回以上繰り返す |
{n,m} | 直前の文字をn〜m回繰り返す |
これらのメタ文字は「量指定子」といって、直前の文字の繰り返しを意味します。
『*
』は「任意の文字を0回以上繰り返す」とありますが、
「0回以上繰り返す」とは、「全く何もなくてもいいし、いくらあってもいい」という意味です。
よって、『?
』は「あってもなくてもいい」、『+
』は「1つ以上あればいい」と解釈できます。
『colou?r
』は『u
』があってもなくてもいいので「colorかcolour」ということになります。
『{n}
』は、たとえば『-{15}
』なら、「ハイフン(-)が15個続くもの」となります。
『-{10,}
』なら「ハイフン(-)が少なくともは10個続くもの(多いのはいくらでも)」、
『-{10,15}
』なら「ハイフン(-)が10〜15個続くもの」となります。
また、複数の文字を繰り返したい場合は括弧で囲みます。
『(Gang){2}Dance
』は『GangGangDance
』と同じ意味になります。
メタ文字 | 意味 |
---|---|
? | 直前の文字を0回または1回繰り返す(欲張り) |
* | 直前の文字を0回以上繰り返す(欲張り) |
+ | 直前の文字を1回以上繰り返す(欲張り) |
?? | 直前の文字を0回または1回繰り返す(非欲張り) |
*? | 直前の文字を0回以上繰り返す(非欲張り) |
+? | 直前の文字を1回以上繰り返す(非欲張り) |
「欲張り」とは、「なるべく多くの文字に適用しようとする」、
「非欲張り」とは、「なるべく少ない文字に適用しようとする」という意味です。
すると、検索する文字列が『a+
』なら『aaa bbb ccc
』、
検索する文字列が『a+?
』なら『aaa bbb ccc
』が置換対象となります。
(「すべてを検索/置換」する場合は当てはまりません)
「『a
』を1回以上繰り返す」ということは、『a
』でも『aa
』でも『aaa
』でもマッチすることになりますが、
「欲張り」かそうでないかで実際のマッチは変わってくるわけです。
文字クラス | 意味 |
---|---|
[abc] | a、b、cのいずれか |
[a-z] | a〜zのいずれか |
[^a] | a以外の文字(改行文字を含めaを除いた全て) |
[^a-z] | a〜z以外の文字(改行文字を含めa〜zを除いた全て) |
文字クラスは『a
』や『<
』などの代わりに文字の種類を指定するものです。
a〜eのどれかの1文字という指定をしたい場合に『[abcde]
』や『[a-e]
』といった指定ができます。
また、文字クラス内の最初に『^
』をつけて『[^abc]
』などとすれば、
「a、b、c以外の何の文字でもいい」とすることができます。
間違いやすいのが「そこにaもbもcも存在しなければいい」という意味ではないということです。
文字クラスは「なんらかの1文字の身代わり」なので、それは何か1文字を表しています。
『-
』は範囲を表すのに使用します。そのため、『[;-%]
』で「; - %のどれか」を表現することはできません。
『-
』を含める場合は必ず最初に持ってきます。すると『[-;%]
』という風になります。
「; - %以外の文字」としたいならば『[^-;%]
』とします。
『[
』や『]
』、『\
』を文字クラスに含めたい場合は直前に『\
』を置いてエスケープします。
「『[
』または『]
』」であれば『[\[\]]
』となります。
『^
』やその他の記号は先頭に置かなければいいので、エスケープの必要はありません。
『.
』は「改行以外のすべての文字」を表しています。
改行は『\n
』で表されるため、『.
』は『[^\n]
』と等価です。
(ただし、正規表現のモードによっては「改行も含めすべての文字」を表す場合もあります)
文字クラス | 意味 | 同等の表記 |
---|---|---|
\w | 記号や空白ではない文字すべて | [a-zA-Z0-9_] |
\W | 記号や空白ではない文字以外 | [^a-zA-Z0-9_] |
\d | 数字 | [0-9] |
\D | 数字以外 | [^0-9] |
\s | タブや改行など、空白類とされる文字 | [ \t\n\r\f\v] |
\S | タブや改行など、空白類とされる文字以外 | [^ \t\n\r\f\v] |
(*間違って『\s
』の同等の表記にも『^
』がついていたのを修正しました)
(『\t
』はタブ、『\v
』は垂直タブ、『\r
』はキャリッジリターン(CR、改行の一種)、『\f
』は改ページ)
これらは『[a-fA-F\d]
』のようにすることで、文字クラスのブラケット(角括弧)内に含めることができます。
「同等の表記」と書きましたが、文字をユニコードして扱うツールの場合は、上記が同等の表記にはならず、
たとえば『\d
』であれば漢数字が含まれてしまったりするので注意が必要です。
『(A|B)
』は「AまたはB」という意味です。(これを「選択」と呼びます)
『(A|B|C)
』なら「A、B、Cのどれか」という意味になります。
『(gray|grey)
』は『gr[ae]y
』とほぼ等価となります。
『[ae]
』は「1文字のaまたはb」という意味になるので結果的に、ほぼ同じ効果が得られるわけです。
(ただし、これはgrayとgreyの違いが1文字だけだったためで、そうでない場合はこうはなりません)
気をつけなければならないのは、その順番です。
『(Java|JavaScript)
』で検索すると、対象文字列内に存在する『Java
』と『JavaScript
』すべてマッチするように思えますが、
『JavaScript
』は選択肢の前(左)のほうにある『Java
』が当てはまってしまうため、
『Script
』部分にはマッチせず、『JavaScript
』というマッチになってしまいます。
選択では左側が優先されるので、『(JavaScript|Java)
』とすることでこの問題は防げます。
(言語、ツールによっては、この問題が起こらない=順番関係なく長いほうを適用しようとするものもあります)
メタ文字 | 意味 |
---|---|
^ | 行頭 |
$ | 行末 |
\b | 単語境界 |
\B | 単語境界以外 |
リテラル文字や文字クラスが「文字自体」にマッチするのと違い、アンカーは「位置」にマッチします。
検索する文字列が『^
』、置換する文字列が『>
』なら、「行頭に『>
』を挿入する」という意味になります。
単語境界とは、「単語を構成する文字=『\w
』に相当する文字」と「単語を構成しない文字=『\W
』に相当する文字」の間の位置のことです。
『regular expression.
』なら『^regular^ ^expression^.
』の4ヶ所に当てはまります。
『\b.*?\b
』とすれば単語すべてにマッチさせることができます。
しかし、「単語構成文字」が基準なので、『JavaScript
』は1単語でも、『L?K?O
』は1単語とは見なされません。
アンカーは位置にマッチするので、文字クラス内に含めることはできません。
『^
』や『$
』を文字クラスに含めても、その文字自体という意味になります。
つまり、『[^$]
』なら「行頭または行末」ではなくて、「『$
』文字以外」ということになります。
また、『\b
』は文字クラス内のみ、バックスペース文字を表す場合が多いようです。
正規表現には、大抵「大文字と小文字を無視する」というオプションがあります。
これが入っていないと「『to:
』で検索しても『To:
』にマッチしない」といったことが起こります。
言語、ツールによっては、正規表現の一部にのみ大文字と小文字を無視する機能があるものもあります。
例えばRubyでは『(?i:foo)
』という形式を使用できます。
『(
?i:Ruby) Python
』という表現なら、『ruby Python
』や『RuBy Python』にはマッチしますが、
『RUBY PYTHON
』にはマッチしない、ということになります。
括弧内に入れた文字列は、ある場所に記憶されます。(「キャプチャ」と呼びます)
これは『\n
』という表記を使って呼び出すことができます。(nは数字)
同じ単語が2連続で出てくるもの(『merry merry
』みたいなもの)を探すという場合、
『\b(\w+)\b \1
』とすることができます。(ここで使った『\1
』を「後方参照」と呼びます)
こうすると、『\1
』の部分は、『(\w+)
』を使ってマッチしたものと同じものがあるものとして解釈されることになります。
括弧を何個も使う場合は、左の括弧から順に『\1
』、『\2
』、『\3
』となります。
また、後方参照は置換文字列にも使うことができます。
つまり置換文字列内に『\1
』と書けば1番目の括弧、
『\2
』と書けば2番目の括弧でキャプチャされたものがそこに入ることになります。
この場合、言語、ツールによっては『\n
』ではなく『$n
』を使う場合もあるようです。
括弧は『(foo|bar)
』という選択や、『(humbert){2}
』というグループ化など、キャプチャ以外にも使われます。
そのため、キャプチャに使われた数字をわかりやすくするために、キャプチャしない括弧もあります。
それには『(?:foo)
』という表記を使います。
前の例であれば『(?:foo|bar)
』と『(?:humbert){2}
』になります。
「その位置の続くものを確認する」というのが「先読み」です。
対象文字列を『JavaScript Java Applet』として考えてみましょう。
『Java(?=Script)
』は「『Script
』が後に続く『Java
』」にマッチします。
『(?=Script)
』の部分が、「『Script
』が後に続くかどうか」をチェックしているので、
後ろに『Script
』が続かない単なる『Java
』にはマッチしません。
『(?=Script)
』の部分は「後に『Script
』が続く位置」にマッチしていることになります。
この例のマッチは『JavaScript Java Applet』となります。
逆に、『Java(?!Script)
』とすれば、「『Script
』が後に続かないかどうか」をチェックするので、
後ろに『Script
』が続かない単なる『Java
』にマッチさせることができます。
こちらは「否定先読み」と呼びます。
この例のマッチは『JavaScript Java Applet』となります。
言語、ツールによっては、「その位置の前にあるものを確認する」という「戻り読み」「否定戻り読み」がサポートされているものもあります。
(これは『(?<=foo)
』『(?<!=bar)
』という形で使います)
先読みや否定先読み、戻り読みなどをまとめて「前後読み」と呼びますが、
前後読みは位置にマッチするため、戻り読みは先読みとは通常書くべき位置が逆になります。
『(?<Mozilla )Firefox
』とすれば、『Mozilla
』に続く『Firefox
』のみにマッチします。
メタ文字 | 意味 |
---|---|
?+ | 直前の文字を0回または1回繰り返す(強欲) |
*+ | 直前の文字を0回以上繰り返す(強欲) |
++ | 直前の文字を1回以上繰り返す(強欲) |
上のほうで?、*、+は「欲張り」だと書きましたが、「欲張り」な量指定子も“ゆずる”ことがあります。
対象文字列が『"something"
』だとして、検索文字列『".*"
』はこれにマッチします。
しかし、強欲な量指定子『*+
』に置き換えて『".*+"
』とするとマッチしません。
これはなぜかというと、「欲張り」な量指定子を使った『.*
』の部分は、
最後の『"
』がなければ『something"
』にマッチすることになりますが、
正規表現の最後に『"
』があるために、対象文字列の最後の『"
』をゆずっているのです。
『.*+
』の部分が『something"
』にマッチしてしまい、
強欲な量指定子をサポートしていない言語、ツールでも、「アトミックなグループ」というものが使える場合があります。
アトミックなグループでは『(?>foo)
』という表記を使います。
『\w?+
』なら『(?>w+)
』、『\w*+
』なら『(?>w*)
』、『\w++
』なら『(?>w+)
』で代替できます。
『*
』の「直前の文字の0回以上の繰り返し」はよく気をつけないと、間違ったものにまでマッチしてしまいます。
リテラル文字と文字クラスは「文字自体」にマッチすると書きましたが、
『-*
』というような表現は、『-
』や『--------
』だけでなく、
なぜそうなるかというと、「0回以上」ということは「なくてもいい」ということだからです。
空文字列へのマッチは、実質上「位置」へのマッチと似たようなものになります。
検索文字列を『-*
』として一括置換すると、
『-
』や『--------
』が置換されるだけでなく、
『-
』が存在しないすべての場所に置換文字列が挿入されてしまうことになります。
正しい正規表現を書くためには、「どう書けばマッチするか」だけでなく、
「どういう場合にマッチしなければいいか」についても考えてみる必要があります。
*
』≒正規表現の『.*
』とありますが、これは厳密には微妙に違います。
ファイルグロブでは《*
》は「任意の文字を1回以上繰り返す」
つまり、1文字以上あればなんでもいいということになります。
この意味だと、《*.*
》は "foo." や ".bar" は当てはまりません。
しかし、「0回以上」であればマッチすることになります。
正規表現では「1回以上繰り返す」は、《+
》なので、
「任意の文字を1回以上繰り返す」は『.+』となります。
よって、《*.*
》とほぼ等価な表現は『.+\..+
』となります。
これは私の勘違いでした。miauさんご指摘ありがとうございます。
「*.*」は foo. にマッチするはずだし、.bar にマッチしないのは、「*」がドットファイルにマッチしないっていう特殊ルールがあるから・・・ですよね?
ファイルグロブの《*
》は、「0回以上繰り返す(ただし例外として、一番最初のドットは表せない)」ということのようです。
《*.*
》とほぼ等価な表現は、正しくは『(?!\.).*\..*
』となります。
正規表現を使うにあたっては、検索対象がどのようなものか知っておくことが重要です。
『\d{4}[-/]\d{1,2}[-/]\d{1,2}
』で日付と思われる文字列を検索することができますが、
これは『00-0000-00-00
』というものにもマッチしてしまいます。(『00-0000-00-00
』)
しかしこれを厳密にしようと思えばかなり複雑な正規表現になってしまうので、
どの程度の厳密さが必要かを把握しておくことが肝要と言えるでしょう。
冒頭にも書きましたが、正規表現は、言語やツールによって微妙な違いがあるので、
その辺りについては各言語、ツールの説明を参照してください。
本格的に学びたい場合はオライリーの「詳説 正規表現」がおすすめです。
(ただ、この本はプログラミングのことを多少は知らないと難しいかもしれません)
また、PHP正規表現チェッカーですぐに試せるようです。
b:id:K-Onoさんの
について。
実ははてなダイアリーもある(d:id:sleepwlk)んですが、長いこと書いてなかったので、
匿名ダイアリーのほうが多くの人に見てもらえるのではないかと思ってこちらに書いてみました。
*2008-09-23 誤記の修正と、一部加筆しました。
*2008-09-24 ワイルドカードの記述を修正しました。
*2008-09-24 文字クラスの記述の間違いを修正しました。b:id:FunnyBunnyDizzyさんご指摘ありがとうございます。
http://anond.hatelabo.jp/20070320012838
del.icio.usやLivedoorクリップを少しだけ触って気づいたのだけど
はてブでタギングするときに半角括弧([])でくくるルールって、結構特殊なんだね。
全角混じりの日本語で全角⇔半角を切り替えるのは、タグの補完機能が実装されていても実は結構ストレスになる。
はてブでタギングを続けるならば、それなりに自分の決めたポリシーがないとだめ。
見方を変えれば、タギングをしっかりしている人のブックマークは掘り起こしていろいろな角度から眺める価値がある=第三者であっても使える資料になるとは考えられないかな。(タギングしないユーザのブクマに価値がないと言っているわけではありません。念のため。)
そういうユーザをみんなで発掘して注目していけば、まだまだはてブだって衆愚じゃないし、使い手はもっとあるはずだと思うよ。
1月にid:zoniaさんが仕掛けた「BMKSBM」って、まだ続いているみたいだし。
http://b.hatena.ne.jp/t/BMKSBM?sort=eid
もう少し、はてブの集合知がどこまで行き着くかを眺めていきたいな。
【追記】
id:REVさんのブクマ※で面白いまとめ記事を紹介してもらいました。
http://grev.g.hatena.ne.jp/keyword/bookmark_Links
日々のブックマークが変わり映えしないな、とか思い始めたときなんかは、こういう記事に目を通してお気に入りを入れ替えてみるのもいいかもしれませんね。