0

hereから関数を取得しました。私の問題は、次のデータを分割するために使用する必要がある RegEx パターンがわからないことです。

+1 vorpal unholy longsword +31/+26/+21/+16 (2d6+13)
+1 vorpal flaming whip +30/+25/+20 (1d4+7 plus 1d6 fire and entangle)
2 slams +31 (1d10+12)

私はそれが次のようになりたい:

+1 vorpal unholy longsword, 31 
+1 vorpal flaming whip, 30 
2 slams, 31

RegExp 検証を行う VBA コードは次のとおりです。

Public Function RXGET(ByRef find_pattern As Variant, _
                        ByRef within_text As Variant, _
                        Optional ByVal submatch As Long = 0, _
                        Optional ByVal start_num As Long = 0, _
                        Optional ByVal case_sensitive As Boolean = True) As Variant
' RXGET - Looks for a match for regular expression pattern find_pattern
' in the string within_text and returns it if found, error otherwise.
' Optional long submatch may be used to return the corresponding submatch
' if specified - otherwise the entire match is returned.
' Optional long start_num specifies the number of the character to start
' searching for in within_text. Default=0.
' Optional boolean case_sensitive makes the regex pattern case sensitive
' if true, insensitive otherwise. Default=true.

Dim objRegex As VBScript_RegExp_55.RegExp
Dim colMatch As VBScript_RegExp_55.MatchCollection
Dim vbsMatch As VBScript_RegExp_55.Match
Dim colSubMatch As VBScript_RegExp_55.SubMatches
Dim sMatchString As String

Set objRegex = New VBScript_RegExp_55.RegExp

' Initialise Regex object
With objRegex
    .Global = False
    ' Default is case sensitive
    If case_sensitive Then
        .IgnoreCase = False
    Else: .IgnoreCase = True
    End If
    .pattern = find_pattern
End With

' Return out of bounds error
If start_num >= Len(within_text) Then
    RXGET = CVErr(xlErrNum)
    Exit Function
End If
sMatchString = Right$(within_text, Len(within_text) - start_num)

' Create Match collection
Set colMatch = objRegex.Execute(sMatchString)
If colMatch.Count = 0 Then ' No match
    RXGET = CVErr(xlErrNA)
Else
    Set vbsMatch = colMatch(0)
    If submatch = 0 Then ' Return match value
        RXGET = vbsMatch.Value
    Else
        Set colSubMatch = vbsMatch.SubMatches ' Use the submatch collection
        If colSubMatch.Count < submatch Then
            RXGET = CVErr(xlErrNum)
        Else
            RXGET = CStr(colSubMatch(submatch - 1))
        End If
    End If
End If
End Function
4

1 に答える 1

3

Excelについてはわかりませんが、これでRegExを始めることができます:

/(?:^|, |and |or )(\+?\d?\s?[^\+]*?) (?:\+|-)(\d+)/

注:ここで少し注意事項があります。これは、要素が only で始まる+(数字が続かない) 場合にも一致します。

キャプチャ グループ 1 と 2 には、カンマの左右にある文字列が含まれます (パターン全体のインデックスが 0 の場合)。したがって、次のようなことができますcapture[1] + ', ' + capture[2](そのための構文が何であれ)。

正規表現の説明は次のとおりです。

/(?:^|, |and |or )         # make sure that we only start looking after
                           # the beginning of the string, after a comma, after an
                           # and or after an or; the "?:" makes sure that this
                           # subpattern is not capturing
 (\+?                      # a literal "+"
 \d+                       # at least one digit
                           # a literal space
 [^+]*?)                   # arbitrarily many non-plus characters; the ? makes it
                           # non-greedy, otherwise it might span multiple lines
                           # a literal space
 \+                        # a literal "+"
 (\d+)/                    # at least one digit (and the brakets are for capturing)
于 2012-09-28T17:29:20.220 に答える