我想将以下内容插入数据库:
(#text1#,#text2#,#text3#,#text4#,#text5#,#text6#,#text7#,#text8#,#text9#), (#text1#,#text2#,#text3#,#text4#,#text5#,#text6#,#text7#,#text8#,#text9#), (#text1#,#text2#,#text3#,#text4#,#text5#,#text6#,#text7#,#text8#,#text9#);
但有时我不会有九个文本字段可以放入我的数据库; e.g。
(#text1#,#text2#,#text3#,#text4#,#text5#,#text6#,#text7#,#text8#,#text9#), (#text1#,#text2#,#text3#,#text4#,#),<<< ---字符串断开并弄乱我的插入 (#text1#,#text2#,#text3#,#text4#,#text5#,#text6#,#text7#,#text8#,#text9#);
什么正则表达式会删除包含没有开始和结束标记的字段的行? 修改:这些行本身始终包含开始标记(#
和结束标记#)
。
我试过了/^\(#.*?#,#.*?#,#.*?#,#.*?#,#.*?#,#.*?#,#.*?#,#.*?#,#.*?#\)$/ig
,但它没有用。
我创建了a page where you can insert a regex to see if your solution works。
答案 0 :(得分:2)
怎么样:
/^\((?:#.+#,\s*){8}(?:#.+#\s*)\)[,;]$/gm
这是一个文本字段的8个非捕获组,其中包含一个或多个字符,后跟逗号和可选空格,另外还有一个文本字段,在字面括号内没有逗号,后跟逗号或分号。如果一个文本字符串中有多行,请确保使用“/ m”开关,以便“^”和“$”匹配换行符。
您应该可以使用它来提取所有有效行。删除其他行会变得更难......
更新
知道了。这是一个匹配具有8个或更少对“#”字符或具有奇数个字符的行:
^\((?:[^#\n]*?#[^#\n]*?#[,\s]?){0,8}(?:[^#]*#[^#]*)?\)[,;]\s*$
匹配如下行:
(#text1#,#text2#,#text3#,#text4#),
或类似的行:
(#text1#,#text2#,#text3#,#text4#,#),
编辑:逗号需要是可选的......
看起来您的新示例不再是每行一个,并且您不再具有“单#”情况,因此可以简化为:
\((?:[^#\n]*?#[^#\n]*?#[,\s]?){0,8}\)[,;]\s*
答案 1 :(得分:1)
你可以试试这个:
/^\(([\s]*#[^#]+#,?){9}\)[,;]$/
修改强>:
在perl中,如果要删除上述集合中少于9 #\d#
的模式的出现,可以使用以下内容:
$string =~ s/\(([\s]*#[^#]+#[\s]*,?){0,8}\)[,;]*//g;
它允许#\d#
两端的空格,一个可选的逗号将它们分隔在parens中,并在组后面用逗号或半开。生成的$string
将是输入字符串中9个标记组的列表,因为它们显示在原始字符串中。
答案 2 :(得分:0)
/^\((#\w+#,?\s?){9}\)$/ matches exactly 9.
答案 3 :(得分:0)
从字符串中删除有一些复杂性,例如如果错误行是最后一个怎么办 - 包含;
line = ^\s*\(.*\)[,;]\s*$
a string token = #[\w\s]*#
a list of tokens = token(?:\s*,\s*token)
7 or less items {0,7}
a list of 8 or less tokens = token(?:\s*,\s*token){0,7}
制作
^\s*\(#[\w\s]*#(?:\s*,\s*#[\w\s]*#){0,7}\)\s*[,;]\s*$
您希望将这些行替换为全局,并将该字符串全局视为多行 /匹配/更换/克
/^\s*\(#[\w\s]*#(?:\s*,\s*#[\w\s]*#){0,7}\)\s*[,;]\s*$//gm
如果为了插入的目的将字符串字符设置为#,那么令牌可以简化为#[^#] +#
在你的示例短行中,最后一个令牌只有一个我到目前为止还没有允许的#,也不是你的sql解析器可以接受的完全空元素。