2

我有一些数据,我想将其转换为表格格式。

这是输入数据

1- This is the 1st line with a 
newline character
2- This is the 2nd line

每行可能包含多个换行符。

输出

<td>1- This the 1st line with 
a new line character</td>
<td>2- This is the 2nd line</td>

我试过以下

^(\d{1,3}-)[^\d]*

但它似乎只匹配到第一个数字 1。

在我的字符串中找到另一个 \d{1,3}\- 后,我希望能够停止匹配。有什么建议么?

编辑:我正在使用 EditPad Lite。

4

6 回答 6

2

您没有指定语言(有许多正则表达式实现),但一般来说,您正在寻找的内容称为“正向预测”,它允许您添加会影响匹配但不会成为其中一部分的模式。

在您使用的任何语言的文档中搜索前瞻。

编辑:以下示例似乎在 vim 中工作。

:%s#\v(^\d+-\_.{-})\ze(\n\d+-|%$)#<td>\1</td>

注释如下:

%      - for all lines
s#     - substitute the following (you can use any delimiter, and slash is most
         common, but as that will require that we escape slashes in the command
         I chose to use the number sign)
\v     - very magic mode, let's us use less backslashes
(      - start group for back referencing
^      - start of line
\d+    - one or more digits (as many as possible)
-      - a literal dash!
\_.    - any character, including a newline
{-}    - zero or more of these (as few as possible)
)      - end group
\ze    - end match (anything beyond this point will not be included in the match)
(      - start a new group
[\n\r] - newline (in any format - thanks Alan)
\d+    - one or more digits
-      - a dash
|      - or
%$     - end of file
)      - end group
#      - start substitute string
<td>\1</td> - a TD tag around the first matched group
于 2012-05-27T12:46:21.213 回答
2

这适用于 vim,并使用 zerowidth positive-lookahead:

/^\d\{1,3\}-\_.*[\r\n]\(\d\{1,3\}-\)\@=

脚步:

/^\d\{1,3\}-              1 to 3 digits followed by -
\_.*                      any number of characters including newlines/linefeeds
[\r\n]\(\d\{1,3\}-\)\@=   followed by a newline/linefeed ONLY if it is followed 
                          by 1 to 3 digits followed by - (the first condition)

编辑:这就是它在 pcre/ruby 中的样子:

/(\d{1,3}-.*?[\r\n])(?=(?:\d{1,3}-)|\Z)/m

请注意,您需要一个以换行符结尾的字符串来匹配最后一个条目。

于 2012-05-27T12:53:00.457 回答
2
SEARCH:   ^\d+-.*(?:[\r\n]++(?!\d+-).*)*

REPLACE:  <td>$0</td>

[\r\n]++匹配一个或多个回车符或换行符,因此您不必担心文件是使用 Unix ( \n)、DOS ( \r\n) 还是较旧的 Mac ( \r) 行分隔符。

(?!\d+-)断言行分隔符之后的第一件事不是另一个行号。

我使用所有格+in[\r\n]++以确保它与整个分隔符匹配。否则,如果分隔符是\r\n,则[\r\n]+可以匹配\r并且(?!\d+-)可以匹配\n

在 EditPad Pro 中测试过,但它也应该在 Lite 中工作。

于 2012-05-29T04:07:13.490 回答
1
(\d+-.+(\r|$)((?!^\d-).+(\r|$))?)
于 2012-05-27T12:46:49.207 回答
1

分三步做对你有好处吗?

(这些是 perl 正则表达式):

替换第一个:

$input =~ s/^(\d{1,3})/<td>\1/; 

更换其余的

$input =~ s/\n(\d{1,3})/<\/td>\n<td>\1/gm;  

添加最后一个:

$input .= '</td>'; 
于 2012-05-27T17:55:47.333 回答
1

您只能匹配分隔符并对其进行拆分。例如,在 C# 中,可以这样做:

string s = "1- This is the 1st line with a \r\nnewline character\r\n2- This is the 2nd line";
string ss = "<td>" + string.Join("</td>\r\n<td>", Regex.Split(s.Substring(3), "\r\n\\d{1,3}- ")) + "</td>";
MessageBox.Show(ss);
于 2012-05-27T12:53:29.100 回答