[英]RegEx: match pattern with minimum occurrences of a string
我試圖提出一種模式來匹配包含"::"
的字符串0次或更多次,但不匹配任何帶有單個":"
的字符串。
因此,舉例來說,如果我想匹配組arg
在"caller message: arg"
和arg
是一樣的東西Class::method()
那么它應該相匹配。 如果字符串是"caller message1: arg1 message2: arg2"
,我不希望它找到單個":"
,在這種情況下,我希望模式同時匹配arg1
和arg2
但不要混淆arg1 message: arg2
as要匹配的字符串。
所以我有類似[^\\[\\]\\s:]+[:{2}]+[^\\[\\]\\s:]+|[^\\[\\]\\s:]+
之類的arg
來匹配arg
部分(試圖查找出現0或1的"::"
)。 顯然,我不是regex專家(或regexpert(或repert);)),我很好奇這的通用版本是什么樣子。 也就是說,我需要什么正則表達式來搜索在模式中沒有以任何部分形式出現的子字符串。 因此,如果我正在尋找"string"
,則匹配中不會出現"s"
, "st"
, "str"
或"string"
開頭的任何子字符串(更通用的版本可能不允許任何子字符串) 。
上面的正則表達式中的想法的問題在於,它沒有考慮"::"
多個實例,例如"Class1::method1(Class2::method2())"
實例。
我正在尋找專門針對整個":"
問題的答案,但也可以以概括的形式隨意回答。
編輯:
tl; dr:我想在caller message: Class1::method1(Class2::method2())
匹配Class1::method1(Class2::method2())
caller message: Class1::method1(Class2::method2())
或匹配Class3::method3(Class4::method4())
caller message1: Class1::method1(Class2::method2()) message2: Class3::method3(Class4::message4())
Class3::method3(Class4::method4())
caller message1: Class1::method1(Class2::method2()) message2: Class3::method3(Class4::message4())
(單獨),但模式不得與Class1::method1(Class2::method2()) message2: Class3::method3(Class4::method4())
EDIT2:
需要說明的是:模式必須在"AB: C::D()"
中匹配字符串C::D()
,在AB: C::D() E: F::G()"
匹配字符串C::D()
和F::G()
但不包含C::D() E: F::G()
。
我不知道我的意圖以及為什么一個簡單的(find me anything)::(anything again)
不足的原因。
EDIT3:
另外,從技術上講,每個之后的部分中都可以有一個空格:
就像C::D("some text")
,這意味着我前面提到的正則表達式不正確,應該更像[^\\[\\]:]+[:{2}]+[^\\[\\]:]+|[^\\[\\]:]+
這是我正在苦苦掙扎的一個真實世界的示例:
[layer runAction: Sequence::actions(actionScale, NULL)]
需要在完整模式中匹配layer
, runAction
和Sequence::actions(actionScale, NULL)
。
和這個:
[Sequence actions: DelayTime::create(1.0), CallFunc::create(this, selector(explodeCells)), NULL]
必須與Sequence
, actions
和DelayTime::create(1.0)..., NULL
匹配
和這個:
[Analytics reportEvent: GENERAL_EVENT usingID: getCurrentID() withParameter: Number::numberWithFloat(Number::defaultNumber() + 1)]
必須匹配Analytics
, reportEvent
, GENERAL_EVENT
和usingID
(可以忽略,但為簡單起見也可以匹配) , getCurrentID()
和withParameters
(也可以忽略), Number::numberWithFloat(Number::defaultNumber() + 1)
。
EDIT4:
我在EDIT3中更改了最終示例,以反映我要實現的最終目標。 這是一個DEMO 。
我不確定您要尋找的是什么,但這是我想到的: DEMO
(\S+::\S+\))
如果您的示例正確無誤,則最簡單的方法是使用后綴識別參數。
正則表達式很簡單
message\d*:\s*(\S+)
鄧諾(Dunno)是否可以幫到您,但是...
問候
編輯:
好-我們再來一遍:)這應該為您做...
\w+:\s*(.*?)(?=$|]|\s*\w+:(?:\w|\s))
如果不是-您的示例和說明不夠清楚(至少對我而言;)
說明:它與單詞字符匹配,后跟一個冒號,並捕獲其后的所有內容,直至1.行尾,2.右括號或3.一個新的單詞字符序列,后跟一個冒號。
如果您要匹配的字符串只能包含::
但不能包含:
嘗試以下操作:
([^:]|::)*
通用版本非常簡單。 每個前綴都以第一個字符開頭,因此除非完全匹配,否則不允許這樣做:
([^s]|string)*
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.