最終更新: 2016-11-18T12:59+0900
tDiaryのプラグインとして今回追加したのは auto_nobrの部分だけ。
add_title_proc {|date, title| auto_nobr = lambda{|src| return src.gsub(/[^{}\[\]()*#"!'`=:|][、。」』!?!?)]+|[「『(]+[^{}\[\]()*#"!'`=:|]/u){ %{{{'<nobr>'}}#{$&}{{'</nobr>'}}} } } inline_or_nil = lambda{|src| lines = src.split(/\r?\n/) return nil if 1 < lines.length html = WikiSection.new(auto_nobr.call lines.first).body_to_html return html.gsub!(/\A\s*<p>/, '') && html.gsub!(/<\/p>\s*\z/, '') } if title.index('<') title.sub(/<span class="title">([^<>]+)<\/span>/){|_0| html = inline_or_nil.call(CGI.unescapeHTML $1) html ? %/<span class="title">#{html}<\/span>/ : _0 } else inline_or_nil.call(CGI.unescapeHTML title) or title end rescue title }
一応。Firefoxの挙動は word-break: break-all
が指定された結果である。であるが、だからとい
かとい
HikiDocで意味を持
全体を対象にするなら JavaScriptでやる。でもテキストを対象にしつつタグをインジ
マ
Operaは独自のレンダリングエンジンを放棄したし、Windows版Safariはア
break-all
任意の位置で自動改行を行うが、日本語のテキストでは「line-break:normal」と指定したときと同じようにゆるい禁則処理を行う。
これを期待して待
この「word-break」というスタイルシ
ートは文の改行の仕方を指定するもので、もともと Internet Explorer 独自の物だ ったようなのですが、最近にな って Firefox もこれを採用したらしいのです。そのため、以前の Firefox では無効化されることを想定してこのスタイルシ ートが指定されていたと考えられます。 サイト制作者の想定としては IE のみにこのスタイルシ
ートを指定したつもりが、意図せず Firefox でも有効化されてしまい、禁則処理のされない読みづらい記事が発生してしま ったということだと思います。おそらく、IE の場合はこのスタイルシ ートが指定されていても禁則処理には影響がなか ったのではないでし ょうか。
先行する IEはまとも。後追いの Firefoxはバカ。日本人の貢献が足りないのか?
良くないと思います。
余談:Googleの検索仕様変更について
1
ヶ月ほど前から、Google検索の左メニ ュ ーが無くな っち ゃいましたねえ。
スクリプトを無効にしてると今でも出てくるんですよ。畳まれたメニ
auto_nobr処理の中の
/[^{}\[\]()*#"!'`=:|][、。」』!?!?)]+|[「『(]+[^{}\[\]()*#"!'`=:|]/u
というパタ
HikiDocで特別な意味を持たない1文字+行頭禁則文字、または、行末禁則文字+HikiDocで特別な意味を持たない1文字
という意味なんだけど、HikiDocで~という部分が
文字列を組み合わせて RegExpのコンストラクタに渡すのは、文字列を Functionコンストラクタに渡すこと(evalと同じ)や、文字列から SQLを組み立てるのに似て好きではない。一面でわかりにくくなるのを承知で書き直すとこうなる。
/(?=([「『(]+)?([^{}\[\]()*#"!'`=:|])([、。」』!?!?)]+)?)(?:\1\2|\2\3)/u
前半の先読み部分は次のような意味の1~3個のキ
(行末禁則文字)?(HikiDocで~)(行頭禁則文字)?
後半の、対象文字列と実際にマ
(?:\1\2|\2\3)
か
キ
最終的にこの日記で使用するパタ
/(?=([「『(]+)?([^{}\[\]()*#"!'`=:|])([、。」』!?!?)]+)?)(?:\1\2\3?|\2\3)/u
これで、か
ひとつ心配なのは、?によ
ここまで書いてから見つけたのがこれ。
word-break: break-all;から、
word-break: normal; word-wrap: break-word;に変更。元々、英数だけの文字がdivをはみ出す現象の防止の為にword-break: break-all; を指定していたが、それだと日本語の句読点が行頭に来てしまう
っぽい。 word-break: normal;だけだと、英数だけの文字がはみ出すが、上のように二つ指定すると、日本語も英語も両方うまくい
った。
ええええええ。くやしいから本文の方だけ CSSで対応する。
/* chiffon_leafgreen.css 183行目 */ div.day { word-break: break-all; word-wrap : break-word; } /* に追加して */ div.section { word-break: normal; }
方針は変更せず、タイトルではき
「2.テキト
というわけで、目途をつけておいた JavaScriptでの実装に切り替えた。
// Firefox(ver.15-23現在まで)が word-break:break-allで禁則処理を // してくれないので NOBRタグで強制的に特定の折り返しを禁止する。 function auto_nobr(textNode) { var create_nobr = function(text){ var d = textNode.ownerDocument; var nobr = d.createElement("nobr"); if (text) { nobr.appendChild(d.createTextNode(text)); } return nobr; }; var m, re = /[「『((]+.[))』」、。!!??]*|.[))』」、。!!??]+/; while (m = re.exec(textNode.nodeValue)) { /* assert 0 < match.length in case of infinite loop. */ nobrText = textNode.splitText(m.index); textNode = nobrText.splitText(m[0].length); nobrText.parentNode.replaceChild(create_nobr(m[0]), nobrText); } return textNode; // the last Node of splitted textNodes. } function apply_auto_nobr_recursively(node) { var except_tags = { "textarea":"タグの包含が許可されていないのか<nobr>で囲ったテキストが消えてしまう。", "nobr" :"二重適用防止" }; for (var child = node.firstChild; child; child = child.nextSibling){ if ((child.tagName||"").toLowerCase() in except_tags) { // skip blacklist-ed elements. } else if (child.nodeType == Node.TEXT_NODE) { child = auto_nobr(child); } else if (child.firstChild) { apply_auto_nobr_recursively(child); } } } var h2 = document.getElementsByTagName("h2"); for (var i = 0; i < h2.length; ++i) { var root = h2[i].parentElement; if (! root || root.tagName.toLowerCase() != "div" || -1 == (" "+root.className+" ").indexOf(" day ")) { continue; } // now root is a div.day. apply_auto_nobr_recursively(root); }
それから、
ひとつ心配なのは、?によ
って存在しないことにされたキ ャプチ ャを参照することが必ずマ ッチの失敗を意味するのかどうか。参照が空の文字列に展開されるなら必ず成功すると判断されてもしかたがない。たとえそれが NULLと空文字列の混同だとしてもありそうな話ではある。
と書いておいた懸念は現実のものだ
alert(/(?=(A)?)\1/.test("B"));
これと区別できた方が応用が広がるのに。
alert(/(?=(A?))\1/.test("B"));
Safariでは <nobr>で囲
既にタグで囲まれているテキストと交差するように <nobr>で囲うことはできない。ということは、「<a>テキスト</a>」
とか <a>テキスト</a>。
みたいなよくあるマ
1.箱の端から端まで文字を満たしたい。
を徹底するためにスタイル指定を足して完成。
.day .section, .day .title > * { text-align: justify; /* 両端揃え */ text-justify: inter-ideograph; /* 日本語両端揃え(IE向けに字間の調整方法を指定する。CSS3?) */ }
Firefox(23.0.1)と IE9は期待通り。Safari(5.1.7)は英字手前のスペ
3.やりすぎた字間調整(text-justify)は見苦しいからやらない。
に反するけど、Safariだけの問題なので知らない。時間が解決するでし
<追記@2013-11-11>WebKit向けに面白いことをしてる人がいますね。「【目指せePub出版】Webkitでtext-align:justifyに挑戦する | 高橋文樹.com」俺だ
<追記@2013-11-12>こういう指摘「iOS5のMobile Safariでは、日本語でも両端揃えができるようになりました | BALLOG」もあるが、提示された例から判断する限り、iOS4で行われていた「
W3C Last Call Working Draft 10 October 2013
The following features are at risk and may be cut from the spec during its CR period if there are no (correct) implementations:
- the ‘text-justify’ property
Value: auto | none | inter-word | distribute
先月出た文書。text-justify(とその他いくつか)が名指しで消滅の危機。後がない。inter-ideographに代えて distributeを指定しといた方が先々有効かも(属性自体が消えてなければ)。
word-breakに line-breakを統合するのはなくな
句点は U+3002;CL # IDEOGRAPHIC FULL STOP。かぎか
CSS distinguishes between three levels of strictness in the rules for text wrapping. The precise set of rules in effect for each level is up to the UA and should follow language conventions. However, this specification does require that:
将来組み版向けに細かい制御が必要だろうとも(別の場所で)言
KADOKAWAが EPUBの取り扱いに関する文書を公開していたな、とダウンロ
■3点リ ーダや2倍ダ ーシがつづく際の禁則の抑制について 3点リ
ーダや2倍ダ ーシ、ナカグロなどは、前後の文字と分離禁止禁則が行われるため、あまり長いと直前の文字から改行されて、意図せぬ表示になることがある。そのようなときは、4文字以上連続する場合を目安に、以下のように「word-break-break-all」を該当箇所にのみ指定すること。未対応の RS もあるが、指定があ って表示が崩れることはないので挿入しておく。
【参考】分離禁止される可能性の高い文字について
CSS3 の「line-break」の項には、行頭・行末で前後の文字との分離が禁止になる文字についての記載がある。詳細は「http://www.w3.org/TR/2012/WD-css3-text-20121113/」の「line-break」の項を参照。
実際には、まだ禁則処理については RS 次第であり、line-break の指定が反映されることも期待できないので、これらに依存するような記述は避ける。
制作仕様ver.1.0.1
基本は word-break:normalで、必要に応じて一部を word-break:break-allで
この PDFでも見たし、数日前に「自炊ePubのためのあれこれ覚え書き - 道具眼日誌:古田-私的記録」でも見たのだけど、tcyというクラス名を。や
20131101p01.08の最後の方に書いてたこと。Firefoxでも IEでも Safariでも同じ挙動――?をキ
The form (?! Disjunction ) specifies a zero-width negative lookahead. In order for it to succeed, the pattern inside Disjunction must fail to match at the current position. The current position is not advanced before matching the sequel. Disjunction can contain capturing parentheses, but backreferences to them only make sense from within Disjunction itself. Backreferences to these capturing parentheses from elsewhere in the pattern always return undefined because the negative lookahead must fail for the pattern to succeed. For example,
/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")looks for an a not immediately followed by some positive number n of a's, a b, another n a's (specified by the first \2) and a c. The second \2 is outside the negative lookahead, so it matches against undefined and therefore always succeeds. The whole expression returns the array:
["baaabaac", "ba", undefined, "abaac"]Microsoft Word - Ecma-262.doc / Standard ECMA-262 3rd Edition - December 1999 / 15.10.2.8 Atom / 139ページ
こちらでも "always succeeds"と書いてある。
Informative comments: An escape sequence of the form \ followed by a nonzero decimal number n matches the result of the nth set of capturing parentheses (see 15.10.2.11). It is an error if the regularexpression has fewer than n capturing parentheses. If the regular expression has n or more capturing parentheses but the nth one is undefined because it hasn't captured anything, then the backreference always succeeds.
15.10.2.9 AtomEscape / 140ページ
残念だ。thereforeとかあ
空パタ
/(?=(A)?)\1/.test("B")) /(?=(A?))\1/.test("B"))
も
Safariでは全半角混在文章に対しては自動的に text-justify:inter-wordに相当する字間調整が選択されるらしく、日本語文章にわずかに含まれる空白が過剰に引き延ばされた見苦しい表示にな
実は word-break:break-allを指定しているとほとんど任意の場所で折り返しができるので(Safariの場合禁則処理も行わないので)わずかなスペ
どうするか。これに対処して「<span style="width:0; font-size:0; overflow:hidden"> </span>」を挿入した人が唯一見つけられる。visibility:hiddenを指定した空白なら挿入してもコピペに影響しないのを Safariと IEと Firefoxで確認した(※)ので自分はこうした。※.textContentには影響するかも。.innerTextには影響しないかも。
// Windows版Safari(5.1.7)の字間調整は全半角混在文章でスペースに対してしか働かず文が不自然に分断されてしまう。 // 不可視の空白を挿入することでさらなる字間調整ポイントを Safariに対して教える。 // 相当うざい結果になる(なにせほぼ任意の2文字の間に SPAN要素が挿入される)ので、Safariでだけ実行するように。 function textfunc2_safari_whitespace_distribution_inter_ideograph(textNode) { var _xp, new_xp = function() { // XP = expansion point if (! _xp) { var d = textNode.ownerDocument; _xp = d.createElement("span"); _xp.style.fontSize = _xp.style.letterSpacing = "0px"; _xp.style.visibility = "hidden"; _xp.appendChild(d.createTextNode(" ")); } return _xp.cloneNode(true); }; var p = textNode.parentNode; var m, re = /\S(?=\S)/; while (m = re.exec(textNode.nodeValue)) { /* assert 0 < match.length in case of infinite loop. */ textNode = textNode.splitText(m.index + m[0].length); p.insertBefore(new_xp(), textNode); } // ついでに、Safariが <nobr>の直前直後の2文字を接着して字間調整も折り返しも行わないのを矯正する。 try { if (textNode.nextSibling.tagName.toLowerCase() == "nobr") { p.insertBefore(new_xp(), textNode.nextSibling); } } catch(e) {} return textNode; // the last Node of splitted textNodes. }
スクリプトの全体はペ
Safariで表示したこのペ
<追記@2013-11-21>見えない、クリ
<追記@2013-11-25>分離禁止と分割禁止の2つの概念。分離禁止は分割禁止を含む、より強い拘束。―と―の間に改行(折り返し)はもちろん空白も挿入してはいけないというのが分離禁止の例。WBRは分割(改行(折り返し)の挿入)を許可する要素だから自動的に字間の挿入も許可しているはず。期待して待
WebKit以外は禁則に対応している。CSSには禁則ル
ールを「通常」から「厳しくする」と3段階の設定がある。両端揃えについては実装依存、「どういう実装をしてもいい。ただ日本語ではJLREQを参照するといい」としている。EPUB仕様も同様である。
Firefoxで word-break:break-allを指定すると禁則処理が行われなくなるのが問題。(対応してるが適用外)
Safariが全半角混在文章に対して日本語向けの両端揃えを選ばないのが問題。(xml:lang="ja-JP"なのに JLREQを参照すべき場面だと思われていない)
PS3のインタ
もうひとつブラウザ。ドロケ
※スクリプト実行中は画面に見えてる3日分のタイトルがせせこましく折り返してた。実行後は先頭の1日だけがせせこましく折り返したままだ
また、ナビゲ
Opera17も試してみたんだけど、フ
URBANOのブラウザは Google Chromeではなか
スマホの Google Chromeで表示してみると PCで見るより一行の文字数が少ない。固定サイズの背景画像を基準にして横幅をピクセルで指定しているために、ひと文字ひと文字をより多くのピクセルを使
Windowsの DPI設定を2倍(192dpi)にするとなんち
Firefoxは高DPI設定に応じて滑らかな、質感すら感じさせる文字を表示する。Safariは、自分の管理外なのであろうウ
仮想的に DPIを上げたからとい
Androidの密度非依存ピクセル「dp」
Density-independent Pixel / dipともいう
このdpという単位は、Androidアプリを作る際に使われる単位で、Androidの開発者向けウ
いまさら聞けないRetina対応のための「ピクセル」の話 – RriverェブサイトではDevice-independent Pixel(密度非依存ピクセル)という単位を定義しています。これは160dpiのピクセル密度を持つデ ィスプレイで表示される1pxを1dpとしたもので、たとえば、320dpiの場合1dp = 2pxに、480dpiの場合1dp = 3pxになります。
Androidでは Windowsや CSS3に準拠した 96dpiではなく、160dpiに固定して論理ピクセル「dp」を定義したと。160:96 = 1:0.6だから、文字の描画に使用する画素数を 60%(縦)×60%(横)に減らしたときに PCとレイアウトが同じになることに納得できる。
そして、1inが現実の 1インチに対応するパタ
これは字詰め。禁則とも字間調整(広げる方)ともかち合うので、これを適用しようとするとタグの交差に対処する方法を真剣に考えないといけない。でもやりたいなあ。読点とかぎ括弧、中黒は全角だと間延びしすぎだし、だから
<link href='https://fonts.googleapis.com/css?family=Noto+Sans:400,700,400italic,700italic&subset=latin,cyrillic,greek,vietnamese' rel='stylesheet' type='text/css'>
や
まとめると、フ
Firefox25での表示(ベンチマ
スクリ
Fx23 on Vistaとの違い。
Fx23 on Vistaとの違い。
プロポ
※参考にすること(メトリクスカ
SVGの方に measureTextとか text-renderingがあるらしい(DOMインスペクタを覗いていたら見つか
といいつつ、せ
長いけど貼りますよ。バ
// 全角の約物・句読点などの連続すると過剰になる余白を詰める。プロポーショナルフォントはもともと // 余白が調整されているから、主にメイリオと等幅フォントが対象になる。 // textfunc2/textfunc3で字間調整のための見えないスペースを挿入した後だと全く // 効果がないのでその前に実行すること。 // // アイディアと実装とカーニングペアの定義の下敷きはこちら。 // http://fladdict.net/blog/2011/02/auto-kerning.html function textfunc4_jizume(textNode) { var is_proportional = function() {// ¿等幅フォントもしくはほぼ等幅のメイリオではない? フォントごとにカーニングペアのひとつひとつについてテストするのもいいかもね。 try { var canvas = textNode.ownerDocument.createElement("canvas"); textNode.parentNode.appendChild(canvas); var ctx = canvas.getContext("2d"); ctx.font = "100% "+getComputedStyle(textNode.parentElement||textNode.parentNode).getPropertyValue("font-family"); // If returned value is the used value, appendChild may be removed. //console.log(""+ctx.measureText("」「").width+" "+ctx.measureText("@@").width); return ctx.measureText("」「").width < ctx.measureText("@@").width; } catch(e) { return true; /* 字詰めをやりすぎないように無難な方を返す。*/ } finally { if (canvas) { textNode.parentNode.removeChild(canvas); } } }; var ki = is_proportional() ? textfunc4_jizume.kerning_info_for_all : textfunc4_jizume.kerning_info_for_monospace; var enclose_in_letterspacing_span = function(textNode, em) { var span = textNode.ownerDocument.createElement("span"); span.style.letterSpacing = ""+em+"em"; span.appendChild(textNode.parentNode.replaceChild(span, textNode)); }; var next_element_char_or_empty = function(textNode) { var skip_blankTextNode = function(node) { for (;node && node.nodeType == Node.TEXT_NODE && /^\s*$/.test(node.nodeValue); node = node.nextSibling) { // empty loop-body; } return node; }; var nextNode = skip_blankTextNode(textNode.nextSibling) || skip_blankTextNode(textNode.parentNode.nextSibling); for (; nextNode && nextNode.nodeType != Node.TEXT_NODE; nextNode = skip_blankTextNode(nextNode.firstChild)) { // empty loop-body. } return (nextNode && nextNode.nodeType == Node.TEXT_NODE) ? nextNode.nodeValue.charAt(0) : ""; // あんまり先の方の文字を読んで letter-spacingを設定しても意味ないかもね。 // 何もしないか、むしろ先の文字に負の marginなりを設定したほうが意味があるかも。 }; for (var i = 0; i < textNode.nodeValue.length;) { var char = textNode.nodeValue.charAt(i); var nextChar = textNode.nodeValue.charAt(i+1) || next_element_char_or_empty(textNode) || "*"; var space = (ki[char+nextChar] || (ki[char+"*"]||0)+(ki["*"+nextChar]||0)); if (space) { var charNode = textNode.splitText(i); textNode = charNode.splitText(1); enclose_in_letterspacing_span(charNode, space); i = 0; } else { i += 1; } } return textNode; // the last Node of splitted textNodes. } /* カーニングペアの定義 単位はem。 -0.5(em) でボックス0.5個分詰まる。 "*く" と定義した場合、"あく"、"いく"、"うく"、というように、全ての"○く"の組み合わせにカーニングが設定される。 "あく" と定義をした場合、 "あく"という文字のペアのみにカーニングが設定される。 ワイルドカードペアと直接指定のペアが衝突する場合、直接指定のペアが優先される。 */ textfunc4_jizume.kerning_info_for_all = { // プロポーショナルフォントでも削られていない(であろう)余白に関して設定する。 // 直接指定のカーニングペア "か。":-0.05, "が。":-0.10, "け。":-0.10, "げ。":-0.15, "す。":-0.15, "ず。":-0.15, "み。":-0.05, "。」":-0.25 }; textfunc4_jizume.kerning_info_for_monospace = { // プロポーショナルフォントでは削られている(ことが多い)余白に関して設定する。 // 前後の文字をワイルドカード指定した汎用のカーニングペア "*ト":-0.10, "*ド":-0.10, "*「":-0.25, "」*":-0.25, "*(":-0.25, ")*":-0.25, "、*":-0.25, "。*":-0.25, "・*":-0.25, "*・":-0.25, "*:":-0.25, ":*":-0.25, // 直接指定のカーニングペア "」「":-0.75, "」。":-0.50, "」、":-0.25, "、「":-0.75, "。「":-0.75, "、『":-0.75, "。『":-0.75, "、(":-0.75, "。(":-0.75 }; for (var k in textfunc4_jizume.kerning_info_for_all) { textfunc4_jizume.kerning_info_for_monospace[k] = textfunc4_jizume.kerning_info_for_all[k]; }
IE9がテキストノ
一部のブラウザ
Node.parentElement - Web API リフーでは、parentElement プロパテ ィは Element ノ ードでのみ定義されており、特にテキストノ ードに対して定義されていない場合がある点に注意して下さい。 ァレンス | MDN
で、parentNodeでなく parentElementを呼んでるのは getComputedStyleの第一引数が Elementでないといけないと書いてあるからで
The first argument must be an Element, not a Node (as in a #text Node).
window.getComputedStyle - MDN
IEの場合だけ parentNodeで誤魔化します。parentである Nodeはいつでも Elementであるという仮定は、確かめてないけど、ほぼ正しいでし
知
is_proportionalが全体の50数%の時間を使
スピ
ライブラリは非同期・最速で読み込んでほしい。それを待
DOMContentLoadedイベントの発火は Blink Opera(18)で非同期スクリプトの読み込み・実行より早いことがある。仕様がどうあれ、画像やスタイルシ
答えは jQueryのソ
や
<追記@2013-12-02>Promiseという名前/概念を仕入れた。asyncな SCRIPT要素が Promiseを返してくれれば、Promise.every(これと、これと、このスクリプト).then(function(scripts){ 指定したスクリプトに依存した処理 })とか書けそう。scriptsが何の配列なのかという疑問は残るが。</追記>
一番遅いのはスクリプトによるブロ
# Rewrite rule1 # shows static html, if exists. RewriteCond /home/vvvvvv/www/cgi_file/ds14050/diary/snap/$1.html -f #RewriteCond %{REQUEST_METHOD} =GET [OR] RewriteCond %{REQUEST_METHOD} =HEAD RewriteCond %{HTTP:Cache-Control} !=no-cache [nocase] RewriteRule ^([0-9]{8})\.html$ /cgi_file/ds14050/diary/snap/$1.html [L]
なんでやめた(GETの場合を除外した)んだ
Latestモ
ETagは必ずしもレスポンスボデ
Content-Lengthはどうか。
[Studying HTTP] HTTP Header Fields
- 転送コ
ーデ ィングが施されている場合、Content-Length ヘ ッダは送られてはならないし、仮に送られてもこれを無視しなければならない - 転送コ
ーデ ィングが施されていない場合、Content-Length ヘ ッダは送られなければならないが、これはメ ッセ ージボデ ィ中のオクテ ット数と正確に一致しなければならない - Content-Length ヘ
ッダが送られない場合は、接続の終了を持 ってエンテ ィテ ィボデ ィの終末を判断する事ができるが、リクエストボデ ィにおいてこの手法は推奨されないし、サ ーバは 411 レスポンスを持 って明示的に拒否する事ができる
レスポンスの場合は接続を閉じることで内容・転送の終了を告げることができるので必ずしも Content-Lengthが必要ではない、のかな?
body = tdiary.eval_rhtml
を
tdiary.write_to($stdout)
みたいな形にする方向でや
いろいろのバ
WBRタグでは効果を得られない。不可視の空白を挿入する方法ではスタイルシ
実装の問題は、要素の挿入ではなく要素で文字を包むことになるのを、他の文字列処理(禁則, 字詰め)が知
対象が共通。操作も若干のバリエ
あとで。
いいかげん HTMLに埋め込むには長々しいので独立した .jsフ
フ
<追記@2013-12-22>is_proportionalが遅いのは先送りされていたブラウザの処理が getComputedStyleをき
混植だ
フ
上の方でリンクした MLで名前を見た人達がいたので。おもしろい。
.offsetWidthを使
is_proportionalのテスト過程で気が付いたんだけど、Opera18と Safari5.1.7で等幅フ
.offsetWidth/.offsetHeightを使function TextLayoutInfo()
として textfunc.ver2.js@2015-03-04に追加した。
結果が出てから調べる奴。
圧倒的じ
まだ高速化をあきらめない。is_proportionalの結果を要素にメモするのでなく font-familyの値をキ
Fx23で1割しか改善しない。getComputedStyleで時間を食
これね(またしても後手)。
前に読んでたけど「offsetWidth のようなプロパテ
経緯をふり返
word-break:break-allから始まる一連のもぐらたたきの結末は、word-break:break-allをやめて自分で分離分割許可ポイントをブラウザに提示することだ
一般的に参考になるのはこちらの記事でし
検索したら TeXとクヌ
まだやword-break: normal; text-align: justify; text-justify: distribute
を指定して得られるはずの結果と同じ。
word-break: break-all
でぶ見苦しい部分が少ないながら残るものの総合的にみて満足してる。Firefoxでスクリプトを切
jslint.comで textfunc.ver2.jsのクリ
Missing 'use strict' statement. line 19 character 55
var sorted_unbreakables = [];Unexpected '--'. line 25 character 60
for (begin_first = this.length; 0 <= begin_first-1; --begin_first) {Unexpected '++'. line 30 character 8
for (begin_last = begin_first; begin_last < this.length; ++begin_last) {Move 'var' declarations to the top of the function.
for (var pos = begin_first; pos <= begin_last; ++pos) {
for文に関するものはスタイルの問題なので変えない(そういえば前に別のスクリプトで jslint.jsを試したときも forまわりが多か
jquery.kerning.js|http://karappoinc.github.io/jquery.kerning.js/
Notice
使用するには、フ
ォントに合わせたカ ーニングデ ータの作成が必要です。 現時点では、ソ ースコ ードに付属しているテンプレ ートを参考に、使用するフ ォントに合わせたカ ーニングデ ータを別途作成する必要があります。 ※ フ
ォントデ ータから自動的にjsonデ ータを生成するツ ールを試作中です。
こういうのはカ
content属性値は読まれてしまうそうです。空白文字に関しては、単語としての認識を阻害し、息継ぎが発生するらしい。
提供するフ
だろうとはいえ悪くはない。手抜きでも完璧でもないほどほどを狙
中里一日記: Mobile SafariのJavascriptで約物のアキ調整 Posted by hajime at 2011年09月29日 15:21
イカしたスクリプト>tsume.js
文字列
日本語識別子
百聞は一見に如かず>20131101.html rendered by Opera28.pdf(1.5MiB)<スクリプトなしで右端が揃
いくつか前のバtext-justify:inter-word
で調整した結果(※IEと違い text-justifyで他の調整方法を指定させてくれなかtext-justify:inter-word
で、日本語部分が text-justify:distribute(inter-ideograph)
相当で調整されているらしく、これ以上を求めるなら個別に手作業するしかないんじ
英字部分が inter-word相当(distributeではない)ということで、英単語の中のアルフ
他の Blink搭載ブラウザはどうなんだろ(インスト
@2015-04-15 Google Chromeだけでなく WebKitの Safariでも改善していたみたい。や
textfunc.jk.jsが読み込まれてるペ
new TextLayoutInfo
と打
TextLayoutInfo\browser | Firefox 22 | Opera 28 |
---|---|---|
fontsize_zero_is_available | true | true |
no_kinsoku_under_wordbreak_breakall | true | false |
no_whitespace_distribution_inter_asciicharacter | true | true |
no_whitespace_distribution_inter_ideograph | false | false |
trueにな
TextLayoutInfoによれば(※自作なのでいまいち信用できない)句読点の禁則にも改善があ
word-break:break-allと text-align:justifyで各ブラウザに起こる諸問題を解決し、未だサポ
undefined
をセ* 全角文字の字間は拡大するが英字はそのままなので、一部は間延びして一部は詰ま
? @2013-11-09 勘違いしてたけどこの部分は Rubyなのでパタ
! 雰囲気で動詞化してみました。
@2015-03-04,(2) textfunc.ver2.js の一部を textfunc.jk.js に分離した。
⁑ 今は無駄だけど将来のう
⁂ う
*4 う
詳細 getComputedStyleを textfunc内から取り除くことは機能低下を招いてできないので、中間デ
最終更新: 2010-09-15T20:40+0900
Command_REPLACE(置換)や Command_REPLACE_ALL(すべて置換)が Command_SEARCH_NEXT(下検索)を呼ぶのをやめたい。連携手段がレイアウト座標を基にした選択範囲しかなく、一文字で表現される CRLFの LFだけがマ
wchar_t単位で検索を行う CSearchAgent::SearchWordが、検索結果をレイアウト座標に変換する際の誤差(前述)を考慮してマ
m/pattern/flag
も s/pattern/replace/flag
も同じ一つのパタSearch(Compile("pattern", flag), "target", startindex)
, Replace(Compile("pattern", flag), "target", startIndex, "replace")
だbregonig.dllや bregexp.dllを使いながらパタ
クリ
例えばクリ
789 456 123
という 3行9文字(改行文字はない)がおさめられているとき、マ789
であり、456
123
はそれぞれ次行、次々行に挿入される。つまり、456
123
はこれから検索対象になるということだ。検索条件が \d{3}
だ^
だ
置換操作が二階層潜らないとロジ
どうして最上層のレイアウトを基準にして文字列処理を行わなければいけないか。文書(wchar_t列としておく)の変更を LayoutMgrに通知する仕組みを整備するのを怠
* 挿入位置・置換範囲を文字レイアウト境界まで拡大して、挿入・置換文字列も同じだけ拡張する。
最終更新: 2014-01-02T18:04+0900
なんてことをこの日記の冒頭に掲げたもんだから自分でや
既存アプリに影響があるので良くないけど、bregonigへの暫定的な変更はこう。
} else { /* ERROR */ onig_err_to_bregexp_msg(err_code, NULL, msg); - return -1; + return err_code == ONIG_MISMATCH_INPUTSHORTAGE ? 0 : -1; }
入力が足りなくてマ
鬼車(5.9.2)に「K.Takata's software : bregonig.dll」で手に入る onig-5.9.2-mod.diffを適用したものをさらに変更。マ
や
なんのことはない、影響を受ける既存アプリにはサクラエデ
一行検索(従来動作)してみて、マ
実装は CSearchAgent::SearchWord()に。これ
バstd::wstring("hoge") == L"hoge"
を使
[\s\S]*$
というパタhitEnd()の実装の参考になるか?と思
Revision 74 hitEnd()の実装(但し仕様は満たしていない)。 Revision 85 useAnchoringBounds()及びuseTransparentBounds()に対応。→hitEnd()の実装を修正。 Revision 103 hitEnd()に@Deprecatedを追加。
/** * This method is experimentation phase, and implementation has not been completed yet. * @return * @deprecated */ @Deprecated public boolean hitEnd() { return (hasAnchoringBounds ? (range == region.end(0)) : (input.length() == end())); }Matcher.java(rev166)
hasAnchoringBoundsが設定されてる場合は無視するとして、そうでないときは入力の長さとマ
そうそう。これこそが hitEnd()の使い道 >Check if string is a prefix of a Javascript RegExp - Stack Overflow コメントの最後に見たことのある名前が☺
PCRE(現在 ver. 8.10)は戻り読みも再帰も(パタ
最終更新: 2010-07-10T01:01+0900
hitEnd
public boolean hitEnd()
このマ
ッチ ャ ーが行な った最前のマ ッチング操作によ って、入力シ ーケンスの終わりに達していたら、trueを返します。 このメソ
ッドがtrueを返したときは、さらに新たな入力を加えると最後のマ ッチの結果が変わる可能性があります。 requireEnd
public boolean requireEnd()
入力を新たに増やすことによ
って、それまでのマ ッチが不成功に変わるならtrueを返します。 マ
java.util.regex クラス Matcherッチが見つか っていたときにこのメソ ッドがtrueを返したら、さら入力を増やすとそのマ ッチがなくなることを意味します。マ ッチが見つか っていたときにこのメソ ッドがfalseを返したら、さらに入力を増やすとマ ッチが変わるかもしれないが、マ ッチがなくなることはないことを意味します。マ ッチが見つか っていないときにrequireEndを呼ぶことは、無意味です。
まず 1.5 で導入された hitEnd メソ
Java 正規表現アプリケッドと requireEnd メソ ッドですが、 hitEnd メソ ッドはドキ ュメントでは入力の末尾がヒ ットした場合にtrueを返すとありますが、入力というのは領域を指しているようなのですが、末尾というのが最後の文字なのか末尾の位置なのかよく分かりませんでした。例えば aa をマ ッチング対象の入力シ ーケンスとして正規表現 aa でマ ッチングを行 った場合、入力シ ーケンス全体にマ ッチしますが、この場合に hitEnd は false を返します。つまり最後の文字がマ ッチしていても true にはならないようです。ところが正規表現 a+ や a* でマ ッチングを行うと aa と同様に入力シ ーケンス全体にマ ッチしますが、この場合は hitEnd は true となります。つまりマ ッチした部分だけでなく正規表現パタ ーン自体も hitEnd の返す値に影響するようです。 ーシ ョン
どちらも入力が一つの文字列におさま
hitEnd()について想像するなら、
search engineが遷移先を残したまま入力を消費し尽くしたときに hitEnd()が trueになる。それの意味することは、直前のマ
ところで、hitEnd()が trueかつ requireEnd()が trueの場合
requireEnd()はなくても困りはしない。マ
hitEnd()も、マ
そうそうこれこれ。>http://www.mail-archive.com/classpath-patches@gnu.org/msg08501.html
さらに、こ
boolean hitEnd()
(This method is unreliable in Java 1.5; a workaround is presented on page 392.)
This method indicates whether the regex engine tried to inspect beyond the trailing end of the input during the previous match attempt (regardless of whether that attempt was ultimately successful). This includes the inspection done by boundaries such as \b and $.
If hitEnd returns true, more input could have changed the result (changed failure to success, changed success to failure, or changed the span of text matched). On the other hand, false means that the results from the previous attempt were derived solely from the input the regex engine had to work with, and, as such, appending additional text could not have changed the result.
The common application is that if you have a successful match after which hitEnd is true, you need to wait for more input before committing to a decision. If you have a failed match attempt and hitEnd is true, you'll want to allow more input to come in, rather than aborting with a syntax error.
Section 8.4. The Matcher Object
最終更新: 2010-05-19T16:21+0900
348 nobodyさん 2008/07/27(日) 01:11:32 ID:sEx2Pn85 質問させてください。 サクラエディタに鬼車5.9.1を搭載して正規表現の勉強をしているのですが、手元にある詳説正規表現には (<)?\w+(?(1)>) このような例があり、<があれば>のマッチを試みる?ということができるみたいです。 ただ、鬼車はこの表現をサポートしていないみたいです。 http://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt 同様のことを鬼車でも実現する方法ってあるのでしょうか?正規表現道場
鬼車は条件付き選択をサポ
(<|)\w+(\1{100}|>)
せこい。姑息だ。100<abc<<<...(94個の<を省略)...<<<>
)にもマ
最終更新: 2010-04-04T07:43+0900
まとめはリンク先に任せるとして、最新の Opera(10.51)ではどうかね、と思
// Opera10.51 /[]/.test("a") //=> false /[^]/.test("a") //=> true
9.61のときとは違
// IE8 /[]/.test("a") //=> "正規表現の中に ']' を指定してください。" (Perlと同じ。だけど IEのバージョンももう 8だよ) /[^]/.test("a") //=> "正規表現の中に ']' を指定してください。" (Perlと同じ。だけど IEのバージョンももう 8だよ) // このエラーが導くのは、パターンのこういう解釈と結果。 /[]]/.test("]") //=> true /[^]]/.test("]") //=> false
変わ
ち
最終更新: 2016-03-05T00:30+0900
経緯 > サクラエデ
差分 > fix_cr_handling_of_regex(下に修正版がある)
お試し > sakuraW.zip (547KiB)(下に修正版がある) (正規表現検索・置換を試すには bregonig.dll(Unicode対応版)が別途必要)
検索、置換を数度試したが機能しているみたい。ただ、$ が本当に改行の手前でマ
^.*$
を空文字列に置換するという最初に提起されたケ
^.+$
あるいは、エデ
.+
で良い。
「正規表現 - SakuraEditorWiki」を見ていて気付いた。\c[、\c]、\c$、\c. という制御文字のひとつを表すパタ
irb(main):001:0> /\M-\C-[/ SyntaxError: (irb):1: too short escaped multibyte character: /\M-\C-[/ from c:/Program Files (x86)/ActiveScriptRuby-1.9.1/bin/irb.bat:20:in `<main>' irb(main):002:0
制御文字なんて扱
一括置換で $ が CRLFの CR直前、LF直前、LF直後(正規表現DLLに与えた文字列末尾)の三カ所にマ
逐一、置換を実行した場合は問題ないことを確認していたのだが、一括置換はライブラリに全部お任せで、検索開始位置を調整することもできないから動作が違
急いで修正 > fix_cr_handling_of_regex.rev2、sakuraW.rev2.zip (547KiB)(さらなる修正版 rev3が下に)
初めて戻り読みを使
\C-X、\M-X というのは Ruby向けなのかも。サクラエデ
対処 > fix_cr_handling_of_regex.rev3、sakuraW.rev3.zip
<追記>bregonig.dllでは \c\X が \cX の意味になるとか。もう知らね
個人プロジ
2.非対応となっているBREGEXP.DLL(ANSI版)への対処方法 ANSI版とUNICODE版は別仕様としてしまうのか?
使用できる正規表現自体が別物なので BREGEXP.DLLは CBregexp::MakePattern()でよいかと。ユ
<追記>ANSI版+bregonig.dll向けのパ
<追記>BREGEXP.DLL版も用意した。>_ANSI.rev2 >_ANSI.rev3</追記>
3.$ が改行なし最終行のEOF手前ともマッチするように改善すること $ を (?=\r\n?|(?<!\r)\n|(?<[^\r\n])$) に置き換える方法を試してみたけどエラーで動きませんでした。
肯定の戻り読みは (?<=) でした(なにせ使用経験がないもので)。気を取り直して、パタ
「以前は行われていたのだろうか?」< 行われていなか
4.検索強調表示が検索時の選択反転表示と一致すること $ を (?=\r\n?|(?<!\r)\n) に置き換えた版で $ を検索すると、改行文字自体は選択反転表示にはならない(マッチしない)のに検索強調表示されている。 また、なぜか上方向検索では改行文字自体にマッチしたかのように選択反転表示になる。
$で検索したときに改行文字が強調表示されるのは、幅0のハイライトには意味がないので、実用面から今のように最低でも幅 1を保つべきだと思
上検索で改行が選択されてしまうのは間違いなので修正したい。これまでが、知らず $ が改行にマ
修正した(rev4)。無限ル
5.正規表現キーワードでの $, . 指定も検索・置換と挙動が一致すること 現状、正規表現キーワードには $, . に検索・置換でやっているような細工が入っておらず、素の正規表現ライブラリ挙動になっている模様。 検索・置換時の . の細工([^\r\n]への置換)が追加されると、今よりも差異が大きくなって混乱しそう。
すでに書いたように、. が \r にマ
\r\n$ みたいな書き方をしていた場合にマ
6.検索・置換や正規表現キーワードの複数行対応への順応性
ノ
>fix_cr_handling_of_regex.rev4、sakuraW.rev4.zip
2ch民は 1.6.5.0をつかうのね。♥マ
Unicode版Revision1662>http://sakura-editor.svn.sourceforge.net/viewvc/sakura-editor?view=rev&sortby=date&revision=1662
Ansi版Patch>http://sourceforge.net/tracker/?func=detail&aid=2869238&group_id=12488&atid=312488
勘違いしていた。Unicode版のサクラエデ
だ
>>> DLL初期化時に呼ばれる仮想関数がありました。(そのたびにチ
CheckRegexpSyntax() は癌だ。検索ボタンを押すたびに DLLのロ
や
おまけとして、bregexp.dllだけが sakura.exeの隣にある状態でエデ
本当は CBregexpが CDllHandlerを継承するのをやめて分離して、1つの CDllHandler(DLLインスタンス)を多数の CBregexp(BREGEXP構造体)から参照するのがいいのかも。も
いまの CBregexpは InitDll()を呼び出されて、途中で違う正規表現ライブラリを読み込まされたとき、コンパイル済みの BREGEXP構造体を正しく解放できるのだろうか?
BREGEXP.DLLでも . と $ を置き換えるようにしてみた > fix_cr_handling_of_regex_ANSI.rev2(下に rev3)
副作用があ
ついでに気にな
表示としては ↵ も ⇠ も ⇣ も同じ一字だから CLayoutのすることにも一理あるのかもしれない。それなら改行文字の部分の選択領域をせめて全角幅にして検索結果のハイライト部分と大きさをそろえよう。
ANSI版の View関連のソ
あたり、なんとかならんかな。検索結果の選択範囲とハイライト領域のずれが気になる。
ANSI版を BREGEXP.DLLと組み合わせているときに、不必要に改行が検索結果に含まれてしまう場合を rev2より大幅に減らした。意地悪なパタ
> fix_cr_handling_of_regex_ANSI.rev3(rev2と rev3にバグ発覚。rev4へ)
fix_cr_handling_of_regex_ANSI.rev4
どういうバグだ
誤: /A|B/ -> /A|B((?:\r\n?|\n\r?)?)/ 正: /A|B/ -> /(?:A|B)((?:\r\n?|\n\r?)?)/
選択 | の結合順位は一番低いのでした。
バグは CBregexp.cppを好き勝手にいじ
していた。これは単なる自己満足。
不必要に選択範囲が改行にかか
バイナリ>sakura.zip
AINI版では LFCRの LFと CRの間に幅0マ
最終更新: 2009-08-25T02:45+0900
20090628p01で書いた Firefoxのバグ
// Firefox 3.0.11 + XRegExp 1.0.1 での実行結果 alert( XRegExp("[]").test("a") ); //=> true alert( RegExp("[]").test("a") ); //=> false
[] と [^] の意味するところ
参考ペ
結局、こういうことだ。
(IEの件を除いて)どのパタ
正しくコメントが読めてるといいんだけど……。
IEが空の文字セ
Firefoxで (?!) の代わりに (?!|)、(?=) の代わりに (?=|) を使うのは良くなくて、つまりこれらの結果は同じになるべきだけど、どちらになるかは将来の Firefox次第だから。バ
\b\B というのは覚えておこう。
冒頭の指摘ははずしてる。考える前に、気付いたことをただ書いたせいだ。
XRegExpの目的の一つは、ブラウザごとにまちまちな挙動を見せる JavaScriptの正規表現に関するメソ
だから空の文字セ
その過程で、Firefoxがネイテ
そうではなくて、ライブラリ利用者として「仕様に準拠した」「ブラウザ間で統一された」機能を望む視点から、XRegExpの提供する空の文字セ
1列目 | 2列目 | 3列目 | 4列目 | |||
RegExp("[]") | XRegExp("[]") | RegExp("[^]") | XRegExp("[^]") | |||
---|---|---|---|---|---|---|
1行目 | Firefox(3.0.11, 3.5RC3) | 必ず失敗 | 任意の一文字 | 任意の一文字 | ||
2行目 | IE(8.0) | 例外 | 必ず失敗 | 例外 | 任意の一文字 | |
3行目 | Opera(9.64) | 任意の一文字 | 必ず失敗 | 必ず失敗 | 任意の一文字 | |
4行目 | Safari(4.0) | 必ず失敗 | 必ず失敗 | 任意の一文字 | 任意の一文字 | |
5行目 | Chrome(2.0.172.33) | 必ず失敗 | 必ず失敗 | 任意の一文字 | 任意の一文字 |
全てのパタ
/(?!)/.test("abc") //=> true! /(?!)(?!)/.test("abc") //=> false /^(?!)/.test("abc") //=> false /(?!)$/.test("abc") //=> true! /a(?!)/.test("abc") //=> false /(?!)a/.test("abc") //=> true! /\b(?!)/.test("abc") //=> false /(?!)\b/.test("abc") //=> true! /(?:)(?!)/.test("abc") //=> true! /(?!)(?:)/.test("abc") //=> true!
(?!) が実質的にパタ
ここまで書いてなか
もう書かれてた! > http://blog.stevenlevithan.com/archives/xregexp-1-0/comment-page-1#comment-37653
自身の機能を XRegExp.addToken()で提供しており、ユ
でも鬼車の \g を追加しようとして、名前付きキ
その \gの利用例が次。
XRegExp("(?<any_backref>\\3|\\4){0} \ (?<smiles>(?::-[D)])+){0} \ ([ab]) ([12]) \\g<any_backref>+\ \\g<smiles> ", "x").test("a22aaa:-):-D"); // truehttp://xregexp.com/api/addtoken_examples/
解説すると、まず名前付きキ
上の例で、実際に文字を消費するパタ
/([ab])([12])\g<any_backref>+\g<smiles>/
Rubyで同じ意図を持
irb> any_backref = /\1|\2/ => /\1|\2/ irb> smiles = /(?::-[D)])+/ => /(?::-[D)])+/ irb> re = /([ab])([12])#{any_backref}+#{smiles}/ => /([ab])([12])(?-mix:\1|\2)+(?-mix:(?::-[D)])+)/ irb> re.match( "a22aaa:-):-D" ).to_a => ["a22aaa:-):-D", "a", "2"]
さて、パタ
/%[Qq]?(?<brace>\{[^\{}]*(?:\g<brace>[^\{}]*)*})/
名前付きキ
addToken()で \g を定義する方法として考えていたのは「パタ
実際の手順は addTokenの第二引数が文字列を返す代わりに toString()を定義したオブジ
xregexp.js (1.0.1)
75 76 77 regex = RegExp(output.join(""), real.replace.call(flags, /[^gimy]+/g, "")); regex._xregexp = { source: pattern,
コ
function PatternOfNamedCapture(name) { this.name = name; } PatternOfNamedCapture.prototype.toString = function(){ // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ if(MAX_RECURSION < count++) { return "(?:)"; } else { return output.slice( defs[this.name].start, defs[this.name].end ).join(""); } // ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ }; XRegExp.addToken( /\\g<([$\w]+)>/, function(match) { return new PatternOfNamedCapture(match[1]); } );
♭ Steven LevithanActually, IE treats [] and [^] like Perl and almost every ..
♭ Steven LevithanThanks for finding and documenting the Firefox (?!) bugs. ..
♭ Steven LevithanRegarding your latest update (dated 2009-07-05 04:40), Oni..
♭ Steven LevithanI just updated the example page I linked to so that the so..
最終更新: 2009-10-28T01:40+0900
再帰
.NETの正規表現を利用した経験はありません(念のため)。想像です。
.NETの再帰に関係した部分のドキ
キ
まず、これは name2という名前付きキ
既に定義されていたグル
ープ name1 の定義を削除し、既に定義されていた name1 グル ープと現在のグル ープの間隔をグル ープ name2 に格納します。
実際に name2のキ
当然のこと、name1のキ
name1のキ
(?(name1)(?!)) が成功する(=name1のキ
なんてこ
// Firefox 3.0.11と 3.5RC3のロケーションバーでの実行結果。 javascript:alert(/(?!)/.test("")) //=> true (falseであってほしい) javascript:alert(/(?=)/.test("")) //=> false (trueであってほしい) javascript:alert(/(?:)/.test("")) //=>
// Windows Vistaでの JScript(WSH)実行結果。 WScript.Echo(""+ /(?!)/.test("")) //=> false (期待通り) WScript.Echo(""+ /(?=)/.test("")) //=> true (期待通り) WScript.Echo(""+ /(?:)/.test("")) //=> true (期待通り)
必ず失敗するパタ
(参考)間違いなく失敗する* > 詳説正規表現第3版 - Google ブ
Internet Explorer 8.0.6001.18783 64-bit Edition、Safari 4.0.530.17、Opera 9.64、Google Chrome 2.0.172.33 でもみんな Firefoxとは逆の結果になる。Firefoxだけが 3.0から 3.5RC3にな
Firefoxに理がないことは次の例からも判断できないか。空のパタ
// Firefox 3.0.11のロケーションバーでの実行結果。 javascript:alert(/(?!)/.test("")) //=> true (下と同じであるべき) javascript:alert(/(?!|)/.test("")) //=> false (期待通り) javascript:alert(/(?=)/.test("")) //=> false (下と同じであるべき) javascript:alert(/(?=|)/.test("")) //=> true (期待通り) javascript:alert(/(?:)/.test("")) //=> true (期待通り) javascript:alert(/(?:|)/.test("")) //=> true (期待通り)
* 念のため断
Regular Expression Cookbook
Oreilly & Associates Inc
¥ 4,073
「XRegExp: JavaScript regex library」は、「SyntaxHighlighter(Ver.2.0)」で使われていたので知
XRegExp(Ver.0.6.1)が、Firefox 2,3、Internet Explorer 5.5-8β1、Safari 3.1、Opera 9.27の JavaScriptに付け加えて利用可能にする正規表現の機能は
後方参照も可。String.replace()での使用も可。
「.」が改行にもマ
ほとんどの空白を無意味なものにしたり(=パタ
(?#ここにコメント)
こんなの。\p{L}, \p{M}, \p{N}, \p{InHiragana}, \p{InKatakana}。否定は大文字のPで \P{}。
文字集合の中で使えないという制限があるが、若干の工夫でなんとかなる。
使い所が限定されていそうだ
(独り言) 名前付きキ
XRegExpのコンストラクタに「脳log[2008-01-11-p01] 鬼車すごい。正規表現で再帰ができる。」で書いたようなパタ
正規表現に関連するいくつかのメソ
IEなどが、幅0の文字にマ
(独り言) limitを指定したときに戻
例えば再帰の深さの上限を 10や 20と決めてしま
驚いた。大部分がライブラリの機能紹介という退屈な(<作者本人が一番よく知
1.0のソ
if line =~ /.*Sector:<.*(Basic Materials|Conglomerates|Consumer Goods|Financial|Healthcare|Industrial Goods|Services|Technology|Utilities)/ p $1 end
HTMLをその場その場の正規表現で処理したくはないけど、それはそれとして、こうする。要は「Sector:HOGEHOGE」というテキストにタグがいろいろ付いていて、それらを無視してセクタ名を取り出したいということかと。
/Sector:(?:<[^>]+>)*(Basic Materials|Conglomerates|Consumer Goods|Financial|Healthcare|Industrial Goods|Services|Technology|Utilities)/
元のパタ
二番目の .* が以降の文字列すべてを食べてしまうのも無駄。それにそれじ
以上お目汚しでした。それより、この質問への最初の回答は金言。良いなあ(こんなレスがすぐに付くなんて)。
正規表現は書き方を覚えないと駄目 なぜなら、ほんの少し変えようと思っただけで別物になるから コピペでやろうとすると異常に遠回りになる
基本的に覚えることは
だけだもの。
正規表現リテラルの /nseuフラグは正規表現のマ
/nが指定されていたり $KCODE='NONE'のとき、「.」は改行を除いたり改行を含んだりする 1バイトにマ
/nseuフラグや $KCODEは正規表現のパタ
Shift_JISで保存したスクリプトフ
irb(main)> /表w/n =~ '表w' => nil irb(main)> /表w/s =~ '表w' => 0
正規表現パタ
♭ ds14050>ところで、hitEnd()が trueかつ requireEnd()が trueの場合 って存在するだろうか。 a..
♭ ds14050なぜだか上のコメントがスパム扱い。@data_path/log/debug.logを見た。 >I, [2012-0..
♭ ds14050>[\/url] ではなく \[\/url] が正しい。 正真正銘正しいのは \[\/url\] だ った。 しかし..
♭ ds14050>requireEnd()はなくても困りはしない。マ ッチの範囲が入力の末尾まで続いていれば無条件に入力を増やしてリト..