已知开始和结束字符串中的不完整行的正则表达式

时间:2009-08-02 03:46:49

标签: database regex

我想将以下内容插入数据库:

  

(#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

4 个答案:

答案 0 :(得分:2)

怎么样:

/^\((?:#.+#,\s*){8}(?:#.+#\s*)\)[,;]$/gm

这是一个文本字段的8个非捕获组,其中包含一个或多个字符,后跟逗号和可选空格,另外还有一个文本字段,在字面括号内没有逗号,后跟逗号或分号。如果一个文本字符串中有多行,请确保使用“/ m”开关,以便“^”和“$”匹配换行符。

您应该可以使用它来提取所有有效行。删除其他行会变得更难......

更新

知道了。这是一个匹配具有8个或更少对“#”字符或具有奇数个字符的行:

^\((?:[^#\n]*?#[^#\n]*?#[,\s]?){0,8}(?:[^#]*#[^#]*)?\)[,;]\s*$

匹配如下行:

(#text1#,#text2#,#text3#,#text4#),

或类似的行:

(#text1#,#text2#,#text3#,#text4#,#),

编辑:逗号需要是可选的......

image

看起来您的新示例不再是每行一个,并且您不再具有“单#”情况,因此可以简化为:

\((?:[^#\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解析器可以接受的完全空元素。