tagcloudや既出単語のautocompleteで使う単語境界正規表現。
/[\w$]+/g
optが存在すれば重複を許可する。
fn.anyword=(d,opt)=>{
let ary=d.match(/[\w$]+/g);
//default only one. //opt is is allow doubles
return (opt)?ary:Array.from(new Set(ary))
}
全部
<div f><textarea a></textarea><textarea b></textarea></div>
<style>
body{margin:0;width:100vw;height:100vh;}
*{background-color:#111;color:#eee;outline:none;resize:none}
[f]{display:flex;height:100%}
textarea{width:50%;padding:0.5rem}
</style>
let fn={}
fn.q=(d=>document.querySelector(d))
fn.sol=(d=>Promise.resolve(d))
;
fn.anyword=(d,opt)=>{
let ary=d.match(/[\w$]+/g);
//default only one. //opt is is allow doubles
return (opt)?ary:Array.from(new Set(ary))
}
;
let a=fn.q('[a]'),b=fn.q('[b]')
,calc=(d)=>{ b.value=JSON.stringify(fn.anyword(d),null,2) }
a.oninput=function(ev){ fn.sol(this.value).then(calc) }
追記、日本語について。
送仮名等は字句解析が必要になるが、それを除けば下の通り。
fn.hiraword=(d,opt)=>{
let ary=d.match(/[\u3040-\u309f]+/g);
return (opt)?ary:Array.from(new Set(ary))
}
fn.kataword=(d,opt)=>{
let ary=d.match(/[\u30a0-\u30ff]+/g);
return (opt)?ary:Array.from(new Set(ary))
}
fn.kanjiword=(d,opt)=>{
//4E00~9FFF 但しこの範囲は簡易的な漢字の範囲。
let ary=d.match(/[\u4e00-\u9fff]+/g);
return (opt)?ary:Array.from(new Set(ary))
}