すいません。
教えて下さい。

1024~65535までの数字範囲を正規表現でヒットさせたいです。
得に言語は問いませんが、私はVBSで実装しようとしています。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

この質問は、質問者さんがフィードバックするわけでもないし、回答側がいろんな想像をしながら、回答しているわけで、これも、その一つなんでしょうけれどもね。



でも、#3でもかきましたが、Perl を使えとまでは言いませんが、テキストファイルなら、grep で十分なのですね。windows用のgrep というのもあります。しかし、kwic(key word in context)のコンコーダンスを作る目的なら、話は違ってきます。

'//Wscript で、argumentは、ドラッグして入れてください。
'//
Dim Matches
Dim Match
Dim objFso
Dim objTxIn
Dim TxIn
Dim Tx
Dim fname
Dim buf

Set objFso = CreateObject("Scripting.FileSystemObject")
If WScript.Arguments.length =0 Then
WScript.Echo "ファイルをドラッグして、このファイル名にDropしてください。"
WScript.Quit
End If
fname =WScript.Arguments.Item(0)
If objFso.GetExtensionName(fname) = "txt" Then
Set objTxIn = objFso.OpenTextFile(fname)
Tx = objTxIn.ReadAll()
Else
WScript.Echo "拡張子がtxtではありません。"
WScript.Quit
End If
With CreateObject("VBScript.RegExp")
.Pattern = "\b([\d,]{4,6})\b"
.Global = True
Set Matches = .Execute(Tx)
For Each Match In Matches
buf = buf & " " & CheckFigures(Match.Value)
Next
End With
If Trim(buf) <> "" Then
WScript.Echo buf
End If

Function CheckFigures(byval num)
Dim num2
If IsNumeric(num) Then
num2 = CLng(num)
If num2 >=1024 And num2 <=65535 Then
CheckFigures =num
Else
CheckFigures =""
End If
End If
End Function
'///
    • good
    • 0

#4に訂正です。



パターンの前後2か所、
\D
ですが、
\D?
または
\D*
でした。
うっかり忘れていました。

失礼しました。
    • good
    • 0

こんにちは。

お邪魔します。

VBSですが、ベタに書いてみました。
もっとも、"1024"-"65535"の数字だけを抜き出す方法、ということですが。

' 数値 →       60000-64999|65 000-499 |655 00-99|6553 0-5 |10000-59999|2000-9999|11 00-99  |10 30-99 |102 4-9
' 桁 →       ⑤ ④  3-1 |④ ③ 2-1 |③ ② ① |②①   | ⑤  4-1 |④  3-1 |④ ③ 2-1 |43 ② 1 |4-2 ①

regexp.Pattern = "\D0*(6([0-4]\d{3}|5([0-4]\d{2}|5([0-2]\d|3[0-5])))|[1-5]\d{4}|[2-9]\d{3}|1[1-9]\d{2}|10[3-9]\d|102[4-9])\D"

このパターンで、
hoge = matchcollection(i).SubMatches(0)
みたいな感じです。

コメントは等倍フォントで見ると、各桁の表現を示唆しています。

パターン冒頭の0*は、"01024"-"09999"等にもマッチさせたい場合のものです。
本当は、4桁数値文字列の場合だけ

前後の\Dは外せないので、用途によっては使い物にならないかも知れませんけれど、、、。
    • good
    • 0

#2の回答者です。



今、ふと気になったことですが、もしかしたら、文章とかの中から、数字を探しだして、それが、範囲内にあるとかでは?そういう場合は、正規表現以外には無理かもしれませんね。他では効率が悪すぎます。こうした質問というものは、えてして、いろんな条件や背景があるものですから、もしそうなら、コードが違ってきます。そういう場合、ANSIでしたら、grep の方が便利かもしれません。Unicodeですと、かなり選択肢が減ります。
    • good
    • 0

こんにちは。



1024-65535という数値を正規表現でヒットできるかなんて、一般的には考えられません。
正規表現は、文字列に対するもので、文字コードを扱うというなら意味は分かりますが、
数値の範囲でマッチさせるには、一旦、Chrで、ダミーの文字を作って、そこで判定させる方法しかないはずです。

a = Chr(1024)
b = Chr(65535)
Re.Pattern = "[" & a & "-" & b & "]"

とぐらいしか思いつきません。

基本的に数値は、数値で扱うしかないと思います。
MsgBox CBool(num >=1024 and num <=65535)
    • good
    • 0

純粋な正規表現では大変面倒くさいので、以下をオススメします



正規表現 \b\d+\b でマッチした文字列を数値に変換して、
その数値が範囲内である場合だけ、マッチした文字列をヒットとして扱う

もし正規表現だけで実現させたいなにか特別な理由があるならば
\b(102[4-9]|10[3-9]\d|1[1-9]\d\d|【中略】|6553[0-5])\b
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「試験範囲」は英語でなんといいますか?

「試験範囲」は英語でなんといいますか?

どの辞書を調べてもthis test covers pages 30-42 のようにしかのっていません。

学校で試験範囲が書かれたプリントのタイトル部分は、一体どのような表現となるのが、英語圏で一般的なのでしょうか。お教えください。

Aベストアンサー

「範囲」とはちょっとニュアンスが違うのだけれど、試験に出る項目のリストには、"exam objectives" とか"Study guide"等と書かれています。
 
学期を通しての試験範囲や試験の日程が書かれたものは"exam schedule" とか "test schedule" と書かれています。
 
黒板の板書や口頭でテスト範囲を発表する場合は、"Test #3 will cover from chapter 5 to chapter 10."等です。 

QVB.NETで、[Ctrl]+[Alt]+[Del]を無効にするプログ

VB.NETで、[Ctrl]+[Alt]+[Del]を無効にするプログラムを考えています。

グローバルキーフックを使用しないで、実現する方法はありますでしょうか?
ご教示の程お願いいたします。

Aベストアンサー

>グローバルキーフック
これの引数っていろいろありますよね?

マウスとキーボードだけは.NETで捕らえることができます。
ただCTL+ALT+DELというショートカットは、これらの管理よりもっと深いところで行われているので、仮にCで作成してフックしても目的の制御の実現は出来ません。


>グローバルキーフックを使用しないで
となると、やはり#1さんの方法しかありません。


#1さんの参考URL中に
「SAS発生時の動作:」
というのがあります。そこに
「GINAのWlxLoggedOnSas()」
というところがあるのですが、その近辺を熟読してください。
そしてこれ
http://msdn.microsoft.com/en-us/library/aa380570(VS.85).aspx


#1さんが示した情報は「古い」のではなく、古くから存在する実現方法というだけです。
そして現在、新たな別方法が出現しているわけではありません。

.NETで作成するDLLとCで作成するDLLは当然異なりますので、質問の
「VB.NETで、[Ctrl]+[Alt]+[Del]を無効にするプログラム」
という質問には、「無理です」としか言いようがありません。

>グローバルキーフック
これの引数っていろいろありますよね?

マウスとキーボードだけは.NETで捕らえることができます。
ただCTL+ALT+DELというショートカットは、これらの管理よりもっと深いところで行われているので、仮にCで作成してフックしても目的の制御の実現は出来ません。


>グローバルキーフックを使用しないで
となると、やはり#1さんの方法しかありません。


#1さんの参考URL中に
「SAS発生時の動作:」
というのがあります。そこに
「GINAのWlxLoggedOnSas()」
というところがあるのですが、その...続きを読む

Q一般に「英語」というときの言葉の概念の範囲について

一般に「英語」というときの言葉の概念の範囲について

日常生活において、「英語」というとき
いわゆる「英語」の他に
慣用的にフランス語やドイツ語などの外国語(特にヨーロッパ圏の言語)のことも含めて
「英語」と呼び慣わす場合があるような気がするのですが。。。

自分の思い過ごしでしょうか?

Aベストアンサー

・・・というよりは、白人が外国語を話していたら、「英語」ときめつけてしまう
風潮がある、ということでしょう。本当はフランス語やドイツ語かもしらないのに。
あるいは、白人が道にまよっていて親切心がある人がつい「英語」で話しかけて
しまうかもしれません。本当は英語は片言で、スペイン語やイタリア語が
自分のことばかもしれないのに。

Q正規表現のパターン " [^<]*?>"

正規表現のパターンの
" [^<]*?>"
これはどういう意味なのでしょうか?

Aベストアンサー

*: 最長一致
*?: 最短一致
*+: 後戻りしない最長一致
というようなバリエーションが、あります。
* に対してと同じように、?、{m,n} にも同じバリエーションがあります。

Q「実行時エラー 9 インデックスが有効範囲にありません」を英語で連絡したい

VBで作ったソフトで良く出る、
実行時エラー 9 インデックスが有効範囲にありません
というエラーを、開発元に伝えたいのですが、

くだんのソフトがアメリカ製英語ソフトになっています。

アメリカの開発元へ、エラーを伝えてあげたいのですが、
MS日本で翻訳した「実行時エラー 9 インデックスが有効範囲にありません」
というエラーメッセージの、本国英語版メッセージが、どういう文面なのか
わからず困っています。

一応、Microsoft Technetも探してみたのですが、私の力量ではお手上げです。

どなたか英語版の原文エラーメッセージをご存知の方、
または、日本語エラーメッセージの原文対訳サイトをご存知の方、
などいらしてましたら、どうか助けてください。

Aベストアンサー

No.4です。
目的がVisual Basicで
>「実行時エラー 9 インデックスが有効範囲にありません」を英語で連絡したい
なら、どのバージョンでも
Run-time error 9 Subscript out of range
だと思います。

ランタイムがインストールされていなければ、Visual Basicは実行できないと思います。
そのプログラムのインストール時かそれ以前にインストールされていると思います。

QVB2008 正規表現 うまくいきません [ ]?

VB2008にてプログラムを組んでいます。

RichTextBox に英文を流し込んでありますが、それに対して英単語を検索して、ハイライトするプログラムを組んでいます。
しかし、正規表現の表現方法が悪くうまく検索してくれません。

例えば、RichTextBox には次のような英文があります。
I have seen many chavette.

上記英文に対して、下記のような正規表現で検索しているのですが、
[ -]?have[ s,-]?
"have s"がヒットしてしまいます。
その他、chavetteという単語も回避したいのにヒットしてしまいます。
どのように正規表現を訂正すればよいでしょうか。

==================================

【have の前に"[ -]?"をつけた理由】
"chavette"
のような単語を回避し、
"abc-have"
のような単語や
" have"
のような前にスペースのある単語はヒットさせたいからです。
"?"は0か1文字という理由です。

【have の後ろに"[ s,-]?"をつけた理由】
"have-had-had"
のような文字列や
"haves"
のようなsがつく単語や
"have,"
のようなカンマつきの単語や
"have "
のような後ろにスペースのある単語はヒットさせたいからです。
"?"は0か1文字という理由です。

VB2008にてプログラムを組んでいます。

RichTextBox に英文を流し込んでありますが、それに対して英単語を検索して、ハイライトするプログラムを組んでいます。
しかし、正規表現の表現方法が悪くうまく検索してくれません。

例えば、RichTextBox には次のような英文があります。
I have seen many chavette.

上記英文に対して、下記のような正規表現で検索しているのですが、
[ -]?have[ s,-]?
"have s"がヒットしてしまいます。
その他、chavetteという単語も回避したいのにヒットしてしまいます。
どのよう...続きを読む

Aベストアンサー

have と haves, have-had-had とは品詞が違うんじゃないでしょうか。
いっぺんに全部を検出しようとするのには向かない例だと思います。
単に単語 have を抽出したいなら \bhave\b が使えますが。

Q英語とスペイン語は現在完了形の守備範囲が違いますか?

たった今話し相手が言ったことを聞き取れなかったとき、What did you say? と[過去形で]聞き返すのが、英語。
Que has dicho? と[現在完了形]で聞き返すのが、スペイン語。このように観察しました。もっとアカデミックな?言い方で説明すると、どんな風に言えますか?英語とスペイン語では現在完了形の守備範囲が違うのでしょうか?

Aベストアンサー

守備範囲は基本的には同じで、どちらも完了、結果、経験、継続を表すのに現在完了形を使います。
スペイン語の方が、過去形、現在完了形の区別を話し手の感情に依存しており、英語よりも用法がフレキシブルです。

例えばスペイン語では極端な話、5年前に起こった出来事を描写する文に現在完了を用いても間違いにはなりません。
分かり易い例を挙げると
Mi abuelo ha muerto hace cinco anos.
など。話し手が今でもおじいさんが亡くなった事を引きずっているんですね。
単純に事実を描写する場合は Mi abuelo murio hace cinco anos. です。

余談ですが、スペインのガリシア地方ではガリシア語に現在完了形が存在しないため
他の地域で完了形を用いる文にも過去形を用いる傾向が強いです。

それに比べると英語の完了形は時を表す副詞(句)によって過去形、現在完了形が明確に分かれています。
現在完了形は明確に過去を表す語句、Yesterdayとか、five years ago等と一緒には使えません。
現在を含む副詞(句)、today、this morning 等は現在完了形を使います。
但し、最近の過去の一時点を表す場合には過去形を用います。

ご質問の What did you say? が What have you said? とならないのは上記の「最近の過去の一時点を表す」場合にあたるのではないでしょうか。

守備範囲は基本的には同じで、どちらも完了、結果、経験、継続を表すのに現在完了形を使います。
スペイン語の方が、過去形、現在完了形の区別を話し手の感情に依存しており、英語よりも用法がフレキシブルです。

例えばスペイン語では極端な話、5年前に起こった出来事を描写する文に現在完了を用いても間違いにはなりません。
分かり易い例を挙げると
Mi abuelo ha muerto hace cinco anos.
など。話し手が今でもおじいさんが亡くなった事を引きずっているんですね。
単純に事実を描写する場合は Mi a...続きを読む

Q[ADO]と[ADO.NET]の違い

VB6とAD0が仲間で
VB.NETとADO.NETが仲間ですか?

よろしくお願いします。

Aベストアンサー

どんな回答を望んでいるのだろうか。
質問文に対する簡潔な回答をするならば 「そうです」 と回答しておきましょうか。
タイトルに対する回答なら 「ado ado.net 違い」 で検索すれば理解可能な回答を得られる。
http://www.google.co.jp/search?q=ado+ado.net+違い&ie=UTF-8&oe=UTF-8&hl=ja

Q「できる範囲でお手伝いします」を英語で

こんにちは。

「私のできる範囲で助けます」
「私の知ってる範囲で助けます」
みたいな言い方は、英語ではどういいますか?
I do help you as I can. とかでいいんでしょうか?
よろしくお願いします。

Aベストアンサー

I'll help you as much as I can.

<参考>
http://tatoeba.org/eng/sentences/show/464753

Q[excel][マクロ]フォルダ内のマクロ有効のブックを通常のブックにするコード

以前フォルダ内の通常のブック(xlsx)をマクロ有効のブック(xlsm)にするマクロを組んだのですがそれを応用して今度は逆の作業をすることになり以前教えて頂いたマクロを有効にするコードを参考に以下を作りましたが動作しませんでした

やりたい作業は
フォルダ内のマクロ化されているブックを開く
通常のブックとして保存
閉じる
次のファイルを開いて同様の動作をフォルダ内のすべてのブックに適用
です

実行したところ
Set wb = Workbooks.Open(Fn)
のところが黄色く表示されてにエラーが出てしまいました、改善点を教えてください


Sub 非マクロ化テスト2()
Dim Fs, Fl, Fn, wb
Set Fs = CreateObject("Scripting.FileSystemObject").GetFolder(ThisWorkbook.Path).Files
For Each Fl In Fs
Fn = ThisWorkbook.Path & "\" & Fl.Name
If Right(Fn, 5) = ".xlsm" Then
Set wb = Workbooks.Open(Fn)
Fn = Left(Fn, Len(Fn) - 5) & ".xlsx"
Application.DisplayAlerts = False
wb.SaveAs FileName:=Fn, FileFormat:=xlOpenXMLWorkbook
wb.Close
Application.DisplayAlerts = True
End If
Next
End Sub

以前フォルダ内の通常のブック(xlsx)をマクロ有効のブック(xlsm)にするマクロを組んだのですがそれを応用して今度は逆の作業をすることになり以前教えて頂いたマクロを有効にするコードを参考に以下を作りましたが動作しませんでした

やりたい作業は
フォルダ内のマクロ化されているブックを開く
通常のブックとして保存
閉じる
次のファイルを開いて同様の動作をフォルダ内のすべてのブックに適用
です

実行したところ
Set wb = Workbooks.Open(Fn)
のところが黄色く表示されてにエラーが出てしまい...続きを読む

Aベストアンサー

こんにちは。

私も、マクロ化のブックは作りましたが、逆は考えたことがありません。
(マクロ化は、VBEの中身を検索し、1行でも存在すれば、.xlsm にするということです。)

もしかしたら、
>CreateObject("Scripting.FileSystemObject").GetFolder(ThisWorkbook.Path).Files

Set wb = Workbooks.Open(Fn)
おそらくエラーの原因は、属性の問題あたりが原因かもしれません。それを、Normal ファイルであるか、調べる必要があるかと思います。

ちなみに、私も独自路線でかんがえてみました。
私は、以下のようにあらがじめ該当するブック名を取得し、配列変数の中に入れておくようにします。Dir は、途中で操作されるのを嫌います。

私のこだわりは、2点
変換後の同名ファイルの存在。
枝番付にします。
後は、パスワードの有無 (たぶん、バージョンによって反応の違いが出るかもしれません。こちらは、Excel 2013 です。)

'//

Sub DeMacroFileName()
 Dim myPath As String
 Dim myArray()
 Dim fName As String
 Dim i As Long
 Dim fn As Variant, nFn As String
 Dim cnt As Long
 Dim wb As Workbook
 ReDim myArray(1999)
 myPath = ThisWorkbook.Path & "\"
 On Error GoTo ErrHandler
 fName = Dir(myPath & "*.xlsm", vbNormal)
 Do While fName <> ""
  If (GetAttr(myPath & fName) And vbNormal) = vbNormal Then
   If fName <> ThisWorkbook.Name Then
    myArray(i) = fName
    i = i + 1
   End If
   DoEvents
   If i > 2000 Then Exit Do '2000ファイル以上は不可能
  End If
  fName = Dir
 Loop
 ReDim Preserve myArray(i - 1)
 
 Application.EnableEvents = False '開いた時にマクロが邪魔になる
 Application.ScreenUpdating = False
 Application.DisplayAlerts = False
 For i = 0 To UBound(myArray)
  fn = myArray(i)
  Set wb = Workbooks.Open(Filename:=myPath & fn, Password:="")
  If Not wb Is Nothing Then
   nFn = RenamingF(fn, myPath)
   wb.SaveAs nFn, xlOpenXMLWorkbook
   wb.Close False
   DoEvents
   cnt = cnt + 1
  End If
  Set wb = Nothing
nextFn:
 Next i
 Application.DisplayAlerts = True
 Application.EnableEvents = True
 Application.ScreenUpdating = True
 MsgBox cnt & "/" & UBound(myArray) + 1 & "が成功しました。", vbInformation
 Exit Sub
ErrHandler:
 MsgBox "ファイル名 : " & fn & vbCrLf & _
 Err.Number & ": " & Err.Description
 
 Debug.Print fn '失敗した時に記録を取る
 If Err.Number = 92 Then  '滅多に発生しません。
  MsgBox "中途で終了します。", vbExclamation
  Exit Sub
 Else
  Resume Next
 End If
End Sub
Private Function RenamingF(ByVal fName As String, mPath As String)
'同名ファイルの枝番付け
Dim SaveName As String
Dim j As Long
If Right(mPath, 1) <> "\" Then mPath = mPath & "\"
SaveName = mPath & Mid(fName, 1, InStrRev(fName, ".") - 1)
 Do While Dir(SaveName & ".xlsx") <> ""
  If InStrRev(SaveName, "_") > 0 Then
   SaveName = Mid$(SaveName, 1, InStrRev(SaveName, "_") - 1)
  End If
   j = j + 1
   SaveName = SaveName & "_" & CStr(j)
  Loop
RenamingF = SaveName
End Function

こんにちは。

私も、マクロ化のブックは作りましたが、逆は考えたことがありません。
(マクロ化は、VBEの中身を検索し、1行でも存在すれば、.xlsm にするということです。)

もしかしたら、
>CreateObject("Scripting.FileSystemObject").GetFolder(ThisWorkbook.Path).Files

Set wb = Workbooks.Open(Fn)
おそらくエラーの原因は、属性の問題あたりが原因かもしれません。それを、Normal ファイルであるか、調べる必要があるかと思います。

ちなみに、私も独自路線でかんがえてみました。
私は、以下のように...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報