アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

よろしくお願いします。

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が見つからない時は、教えて!gooで質問しましょう!