30921


正規表現  
エクセルの名前定義に使える文字列の正規表現を書きたいです、  
１．先頭に「数字」、または「R数字」、「C数字」で始まらないこと  
２．スベース（全角半角）、タブ、改行など「$s」で表現できる文字列を含まないこと  
３．アンダーライン（全角半角）、円マーク（全角半角）以外の符号を含まないこと

調べて見たら：  
１．→ /^(?!(\d|(R|C)\d))/i  
２．→ (?!.*\s).+$  
３．→ わからない

教えていただきたいこと：  
・１，２の書き方は正しいですか  
・３の書き方  
・１，２，３を「且つ」の関係で繋いた最終正規表現

よろしくお願い致します。


CC BY-SA 3.0
2016-12-05T02:47:10.093
30912
2016-12-05T07:43:53.177
15509
question
正規表現 excel vba
エクセルの名前定義の正規表現


**※質問に書かれている条件がExcelの名前定義の仕様に一致しているかどうかは未確認です。**  
**※正規表現は処理系によって違う部分がありますが、VBAでの動作は未確認です。**  
**※以下に書いた正規表現は`/.../`で囲まれた中身(...の部分)のみ記載しています。**

* * *

> ・１，２の書き方は正しいですか

もしかしたらVBAだと動くのかもしれませんが、おそらく間違っていると思います。

* * *

> １．先頭に「数字」、または「R数字」、「C数字」で始まらないこと

先頭が数字、R、C以外で始まる、という意味なら以下の様になります。

[code]

    ^[^\dRC]
    
[/code]

先頭の`^`は文字列の先頭、`[^]`は除外する文字グループを表します。

* * *

> ２．スベース（全角半角）、タブ、改行など「$s」で表現できる文字列を含まないこと

処理系によって`/s`に全角スペースが含まれる場合と含まれない場合がありますが、含まれないなら

[code]

    ^[^\s　]+$
    
[/code]

になります。(`\s`の後ろは全角スペース)  
`[^]+`は指定の文字以外で構成される1文字以上の文字列を表します。

* * *

> ３．アンダーライン（全角半角）、円マーク（全角半角）以外の符号を含まないこと

正規表現に符号というグループはないですし除外したい文字を全て指定する必要があります。  
`+-*/`を除外するなら

[code]

    ^[^\+\-\*\/＋－＊／]+$
    
[/code]

記号は正規表現上で特別な意味を持つので`\`でエスケープする必要があります。

* * *

> ・１，２，３を「且つ」の関係で繋いた最終正規表現
[code]

    ^(?=[^\dRC])([^\s　\+\-\*\/＋－＊／]+)$
    
[/code]

2と3は除外する文字を指定するので1つにまとめます。  
1の先頭文字のチェック後、先頭文字は2,3のチェックにも通したいので、`(?=)`を使用します。(肯定先読み)

* * *

尚、ここで書いた正規表現の確認は以下のRubyの正規表現を試せるサイトで確認しました。

<http://rubular.com/>


CC BY-SA 3.0
2016-12-05T04:37:28.720
30914
2016-12-05T04:43:33.767
2016-12-05T04:43:33.767
18862
18862
30912
answer


完全な正規表現を記述するのは諦めた方がいいと思います。

[数式で名前を定義し使用する - 名前の構文規則について](https://support.office.com/ja-
jp/article/%E6%95%B0%E5%BC%8F%E3%81%A7%E5%90%8D%E5%89%8D%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B-4d0f13ac-53b7-422e-afd2-abd7ff379c64#bmsyntax_rules_for_names)に説明があります。

>   * **有効な文字** 名前の最初の文字には、文字、下線 (_)、円記号 (¥)
> しか使用できません。最初の文字以外には、文字、数値、ピリオド、および下線を使用できます。  
>  ヒント: 大文字と小文字の "C"、"c"、"R"、"r"
> は予約されているため、定義された名前として使用することはできません。これらの文字を、[名前] または [移動先] テキスト
> ボックスに入力すると、現在選択されているセルの行または列が選択されます。
>   * **セル参照と競合する名前は不可** Z$100 や R1C1 など、セル参照と競合する名前は使用できません。
>   * **スペースは不可** スペースは名前の一部として使用できません。単語の区切りには、下線 (_) やピリオド (.) を使用してください
> (Sales_Tax、First.Quarter など)。
>   * **名前の文字数** 名前に使用できる文字数は、255 文字までです。
>   * **大文字と小文字の区別** 名前には大文字と小文字の両方を使用することができます。名前の大文字と小文字は区別されません。たとえば、ブックに
> "Sales" という名前を付け、同じブックに "SALES" という名前を付け直すと、一意の名前を付けるように求めるメッセージが表示されます。
>

という条件ですが「文字」が何を認めるのか曖昧です。実際問題、ひらがなや漢字は認められますが、その範囲を特定し正規表現で記述するのは容易ではありません。  
「セル参照と競合する名前は不可」も結構大変です。`ABC1`はダメですが`XYZ1`はOKでした（右上のセル名が`XFD1`のため）。

* * *

VBAの正規表現エンジンのドキュメントは[正規表現の構文](https://msdn.microsoft.com/ja-
jp/library/cc427970.aspx)にあります。


CC BY-SA 3.0
2016-12-05T07:43:53.177
30921
2016-12-05T07:43:53.177
4236
30912
answer