理解否定的字符类

时间:2017-04-06 07:47:08

标签: regex regex-negation

正则表达式:

/''+[^f]/g

应用于字符串时:

don't '''theater'''  but not'''d and not do'''f

也匹配do'''f中的三个撇号。为什么[^f]不排除它?

小提琴是here

PS:我想找到连续的两个或更多个撇号,然后不是f。

3 个答案:

答案 0 :(得分:3)

+在2个或更多f之后找到'后,会使正则表达式引擎回溯。您可以使用'替代方法预防否定前瞻(以免使用f'以外的字符,当您使用[^f]时,该字符将成为其中的一部分匹配,因为否定的字符类是消费模式,前瞻是零宽度断言。)

''+(?!['f])

请参阅regex demo。如果(?!['f])'跟随2个或更多f个符号,'会阻止匹配。此外,您可以使用限制量词{2,}(2次或更多次出现)来编写它:'{2,}(?!['f])

如果您的正则表达式引擎支持占有量词以阻止回溯到量化模式,请使用一个:

''++(?!f)
  ^^

请参阅another demo(另一种撰写方式是'{2,}+(?!f))。

如果您使用的是不支持所有权量词的.NET正则表达式库,则可以使用原子组(与所有权量词相同,但对于整个组):

(?>'{2,})(?!f)

请参阅.NET regex demo

答案 1 :(得分:1)

因为撇号是一个不是 void BuyStock() //Searches and Edits Customer Information { int i=0, j=0, n=0; product item[1000]; int qty,q; double cpi; double price, p; n=LineCount()-1; i=ArrayAssign(); if (i>=n) cout << "No item found"; if (i>=n) return; j=i; ifstream FileSearch("stock.txt"); string name; i=0; if (FileSearch.is_open()){ while (!FileSearch.eof()) { getline(FileSearch, name, '|'); item[i].name=name; FileSearch >> qty; item[i].qty=qty; getline(FileSearch, name, '+'); FileSearch >> price; item[i].price=price; getline(FileSearch, name, '@'); FileSearch >> cpi; item[i].cpi=cpi; i++; } } else cout << "Error" << endl; FileSearch.close(); cout << item[j].name << " " << item[j].qty << " " << item[j].price << " " << item[j].cpi << endl; cout << "Type in the changes, according to category. Retype if you want to keep the same data." << endl; //Editing Section cin.ignore(); cout << "Item name: " << item[j].name << endl; cout << "Item quantity: "; cin >> qty; cin.ignore(); q = item[j].qty; item[j].qty = q + qty; cout << "Item price: "; cin >> price; cin.ignore(); p = item[j].price; item[j].price = p + price; item[j].cpi = item[j].price/item[j].qty; ofstream FileSave("stock.txt"); for (j=0; j<n; j++){ FileSave << item[j].name << " | " ; FileSave << item[j].qty << " + "; FileSave << item[j].price << " @ " ; FileSave << item[j].cpi; FileSave << endl;} return; 的字符。

样本正则表达式匹配“至少2个撇号,后跟不是f ”的字符。
enter image description here
你看,最后一场比赛真的不包括f而是撇号。因此,如果您想要排除最后一场比赛,您可能更喜欢这个正则表达式

''+[^'f]

答案 2 :(得分:0)

所有你需要的是一个atomic group所以正则表达式不会回溯到撇号,这不是一个&#39;

/(?>''+)[^f]/

你可以玩它here

如果您的引擎支持possessive quantifiers,那么您也可以使用它们:

/''++[^f]/

如果您想接受任何既不是撇号也不是f的字符,那么您可以定义只排除另一个字符:

/''+[^'f]/