Skip to main content
June 18, 2021
質問

Indesign javascriptの正規表現で特殊文字検索

  • June 18, 2021
  • 返信数 3.
  • 2597 ビュー

Indesign CC2018です。

JavaScriptの正規表現でテキスト内容の比較をしたいのですが、

テキストアンカーやここまでインデントなどの特殊文字は無視して比較したいのです。

 

テキストアンカーやここまでインデントなどの特殊文字をJSの正規表現で

検索することは可能でしょうか?

できれば特殊文字系全てを一括で、ダメなら個別でも。

このトピックへの返信は締め切られました。

返信数 3

Ten A
Community Expert
Community Expert
June 18, 2021

JavaScriptで調べるのが良いかと思います。

当該キャラクタを選択した状態で

alert(app.selection[0].contents.charCodeAt(0).toString(16))

でいけるかと思います。 

kawamoto_α
Participating Frequently
June 18, 2021

特殊文字1文字だけを選択した場合のcontentsはSpecialCharacters Enumになってしまうのでこれだとエラーになります。
調べたい文字と、その次の文字まで選択して実行すれば大丈夫。

June 18, 2021

ありがとうございます。

こちらも試してみます。

Ten A
Community Expert
Community Expert
June 18, 2021

単純にそのモノを指定するなら文字コードダイレクトに指定すれば可能です。

 

Stringt.match(/[\x07]/);

 

ちなみに、InDesignの特殊キャラクタはBellやEnd of Textと言った制御文字を利用してたりします。ただし、無視するのであればそういった事は考えずにマッチさせたい条件をしっかり考えれば良いだけです。
これはJavaScript側のRegExpを使おうがInDesignの検索機能であるfindGrepPreferenceを操作しようが同様です。まずはロジカルな部分を熟考する必要があります。

June 18, 2021

ありがとうございます。

 

テキスト比較はあらゆる文字が可能性としてはあるので、

視覚的な文字列の内容が一致しているかを知りたいのですが

このような場合に適した比較方法ってどの様にしたら良いのでしょう?

yusuke.s
Inspiring
June 18, 2021

横からすみません。

InDesignで表現できる文字列は非常に多いので,実はそんなに簡単な話ではないです。

例えばサロゲートペアを考慮するかどうかだけでもスクリプト側の難易度は跳ね上がります。

また,コードポイントによる比較になるので,InDesignで表現される異体字はString型オブジェクトと単純に比較できません。

InDesignであればオープンタイプフィーチャーまでたどって調べる必要がありますし,String型オブジェクトには字形という概念をもたせることができません(IVSなどを利用する必要があります)。

 

ですので,「視覚的な文字列の内容」とおっしゃいますが,どの程度のレベルまで比較するかは準備するテキスト,InDesignのデータと比較し,取り得る最大限の範囲をスクリプト開発者側が明確に線引する必要があります。

 

このような場合に適した比較方法ってどの様にしたら良いのでしょう?

というご質問ですが,テキスト比較は地道に実装するほかないと思います。要するに不要な文字列を除外するとか,サロゲートペアの場合の文字コード計算式を組み込むとか…です。

スクリプトで文字を扱う,特にExtendScriptで扱うのは実は非常にシビアで知識も要求されます。

Yusuke S.
yusuke.s
Inspiring
June 18, 2021

幾つか教えてください。

  • テキスト内容を比較したいというのは,何と何になりますか? InDesign上の何かしらのテキストとString型オブジェクト,つまりスクリプト上での文字列,ということですか? それとも,InDesign上のテキスト同士でしょうか?
  • 特殊文字とは具体的に何でしょうか? すべて列挙できますか? それとも不可視文字(制御文字)全般を指しますか?
  • スクリプト上でその結果を知りたいということかもしれませんが,例えばそういうテキスト同士を比較できるツールがあるエディタもあります。そういうものではなく,あくまでスクリプト上でその結果を知りたい,ということでいいですか?

 

以下,InDesign上のテキスト対String型オブジェクトの文字列を前提として,テキストアンカーとここまでインデントを例にテキスト内容を比較する例です。

var indStr = app.selection[0].contents;
var difStr = "てきとうてきすと";

// 単純比較
alert(indStr === difStr); // false

// アンカーテキストとここまでインデントをreplaceする
var tempStr = indStr.replace(/[\ufffc\u0007]/g, "");
alert(tempStr === difStr); // true;

 ご参考まで。

 

Yusuke S.
June 18, 2021

インデザインのテキストフレームやセルの中身(旧商品情報)をJavaScriptで文字列として取得し、

テキストデータとして用意したテキスト(新商品情報)との比較です。

情報が変更になっていれば、置き換えるという処理を行っており、空白文字列は無視しているのですが

インデザイン側に特殊文字が含まれている場合に異なる文字列として判断されてしまうので。

主にアンカーテキストとここまでインデントの処理なのですが、

他の特殊文字も含まれる可能性もあるので、できれば一括で無視できればと思いました。

 

アンカーテキストとかの文字コードは存在するのですね。ありがとうございます。

この文字コードってどのように取得したらよいのでしょうか?

yusuke.s
Inspiring
June 18, 2021

情報パネルから見られますよ。コードポイントなので,JavaScriptで扱う場合は

'\u0000'

という形で(最大4桁)使ってください。

 

JSから調べるなら,Ten_Aさんが下でおっしゃっているような方法があります。

Yusuke S.