正则表达式:
/''+[^f]/g
应用于字符串时:
don't '''theater''' but not'''d and not do'''f
也匹配do'''f
中的三个撇号。为什么[^f]
不排除它?
小提琴是here。
PS:我想找到连续的两个或更多个撇号,然后不是f。
答案 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
”的字符。
你看,最后一场比赛真的不包括f
而是撇号。因此,如果您想要排除最后一场比赛,您可能更喜欢这个正则表达式
''+[^'f]
答案 2 :(得分:0)
所有你需要的是一个atomic group所以正则表达式不会回溯到撇号,这不是一个&#39;
:/(?>''+)[^f]/
你可以玩它here。
如果您的引擎支持possessive quantifiers,那么您也可以使用它们:
/''++[^f]/
如果您想接受任何既不是撇号也不是f的字符,那么您可以定义只排除另一个字符:
/''+[^'f]/