通过忽略不同的括号来匹配模式

时间:2020-05-06 05:08:49

标签: php regex

我有一个字符串,我想知道模式的第一个位置。但是,只有在没有用方括号括起来的情况下,才应该找到它。

示例字符串:“ This is a (first) test with the first hit

我想知道第二个first => 32的位置。要与之匹配,(first)必须忽略,因为它放在方括号中。

很遗憾,我不必仅忽略圆括号( ),而不必忽略方括号[ ]和括号{{1} } {

我尝试过:

}

工作正常,但结果是第一个比赛的位置(11)。

所以我需要更改preg_match( '/^(.*?)(first)/', "This is a (first) test with the first hit", $matches ); $result = strlen( $matches[2] );

我试图用.*?替换它,希望括号内的所有字符都将被忽略。但这与括号不符。

而且我不能使用否定的前瞻性.(?:\(.*?\))*?,因为我有三种不同的括号类型,必须与左括号和右括号匹配。

1 个答案:

答案 0 :(得分:1)

您可以将不需要的所有3种格式与分组和交替使用,并使用(*SKIP)(*FAIL)来获得那些匹配项。然后在单词边界@State var itemn = 0 @State var priceList : [String] = [""] @State var itemList : [String] = [""] @State var isEditing = false func deleteItems(at offsets: IndexSet) { let a = offsets.count priceList.remove(at: a) itemList.remove(at: a) } var body: some View { GeometryReader{ res in ZStack{ Spacer() }.padding().background(LinearGradient(gradient: Gradient(colors: [Color(red: 0.171, green: 0.734, blue: 0.955), .white]), startPoint: .bottom, endPoint: .trailing)).background(Color(red: 0.171, green: 0.734, blue: 0.955)).edgesIgnoringSafeArea(.bottom) ZStack{ VStack{ Form{ Section{ HStack{ Section(header: Text("To-Do List ").font(.largeTitle).fontWeight(.thin)){ Spacer() Button(action: { self.itemn += 1 self.itemList.append("") self.priceList.append("") print(self.itemList) }, label: { Text("Add") }) } } List{ ForEach(0 ... self.itemn, id: \.self){s in VStack{ HStack{ Text("Title: ") TextField("Expense ", text: self.$itemList[s]) } HStack{ Text("Price: $") TextField("0.00", text: self.$priceList[s]).keyboardType(.decimalPad) } Button(action: { self.priceList.remove(at: 0) self.itemList.remove(at: 0) }, label: { Text("delete") }) } }.onDelete(perform: self.deleteItems) } } }.onAppear { UITableViewCell.appearance().backgroundColor = .clear UITableView.appearance().backgroundColor = .clear UITableView.appearance().separatorColor = .clear }.padding() Spacer() } } }.navigationBarItems(leading: Text("To - List").font(.largeTitle).fontWeight(.thin).padding(.top)) }

之间匹配first
\b

Regex demo

示例代码

(?:\(first\)|\[first]|{first})(*SKIP)(*FAIL)|\bfirst\b

输出

$strings = [
    "This is a (first) test with the first hit",
    "This is a (first] test with the first hit"
];

foreach ($strings as $str) {
    preg_match(
        '/(?:\(first\)|\[first]|{first})(*SKIP)(*FAIL)|\bfirst\b/',
        $str,
        $matches,
        PREG_OFFSET_CAPTURE);
    print_r($matches);
}

Php demo