1
[15-]
[41-(32)] 
[48-(45)] 
[70-15] 
[40-(64)] 
[(128)-42] 
[(128)-56] 

中括弧で囲まれていない値を抽出したいこれらの値があります。複数ある場合は、それらをまとめて追加します。

これを行うための正規表現は何ですか?

したがって、ソリューションは次のようになります。

[15-] -> 15
[41-(32)] -> 41
[48-(45)] -> 48
[70-15] -> 85  
[40-(64)] -> 40
[(128)-42] -> 42
[(128)-56] -> 56
4

4 に答える 4

0

正規表現は、項での計算の実行をサポートしていません。一致したグループをループして、正規表現の外部で計算を実行できます。

以下は、角かっこ内に含まれていない任意の数値を抽出するパターンです。

\[
  (?:(?:\d+|\([^\)]*\))-)*
  (\d+)
  (?:-[^\]]*)*
\]

各数値は $1 で返されます。

これは、ダッシュで区切られた任意の数の「単語」が前に付いている数字を探すことで機能します。「単語」は数字自体または括弧で囲まれた文字列であり、最後に到達する前にオプションでダッシュやその他のものが続きます。ブレース。

VBA の RegEx が uncaptured groups をサポートしていない場合は(?:)、すべての を削除する?:と、キャプチャされた番号が代わりに $3 になります。

より単純なパターンも機能します。

\[
  (?:[^\]]*-)*
  (\d+)
  (?:-[^\]]*)*
\]

これは単にダッシュで区切られた数字を探し、数字が最初または最後にあることを許可します。

于 2013-08-28T05:39:48.903 に答える
0
Private Sub regEx()

    Dim RegexObj As New VBScript_RegExp_55.RegExp
    RegexObj.Pattern = "\[(\(?[0-9]*?\)?)-(\(?[0-9]*?\)?)\]"

    Dim str As String
    str = "[15-]"

    Dim Match As Object
    Set Match = RegexObj.Execute(str)



    Dim result As Integer
    Dim value1 As Integer
    Dim value2 As Integer

    If Not InStr(1, Match.Item(0).submatches.Item(0), "(", 1) Then
        value1 = Match.Item(0).submatches.Item(0)
    End If

    If Not InStr(1, Match.Item(0).submatches.Item(1), "(", 1) And Not Match.Item(0).submatches.Item(1) = "" Then
        value2 = Match.Item(0).submatches.Item(1)
    End If

    result = value1 + value2

    MsgBox (result)
End Sub

[15-] をその他の文字列で埋めます。

于 2013-08-28T06:09:24.217 に答える
0

@richardtallent が指摘したように、正規表現のアプローチを使用すると (この場合は少なくとも) 複雑になりすぎます。また、正規表現は数学演算をサポートしていません。

ここに示すアプローチを使用して、最初と最後の大括弧を省略した部分文字列を抽出し、 (ここSplitに示すように) を使用し、ダッシュ記号を使用して文字列を 2 つに分割できます。最後に、関数 (ここに示すように) を使用して、分割によって生成された部分文字列にブラケットが含まれているかどうかを確認します。Instr

部分文字列のいずれかに角かっこが含まれている場合、それらは加算から除外されるか、そうでない場合は加算されます。

于 2013-08-28T05:46:00.097 に答える