我正在尝试专门填写标签文本中的/。

1234/1234/ABCDE => 1234 / 1234 / ABCDE

在上下文中;如果我有一个标签:

<a href="http://www.domain.com/path/to/page.html">12 34/1234A/BC DEFG</a>

我想得到:

<a href="http://www.domain.com/path/to/page.html">12 34 / 1234A / BC DEFG</a>
有帮助吗?

解决方案

这个正则表达式可以解决这个问题:

(\s*/\s*(?=[^<>]+<))

它只会替换标记内的'/'而不是URL。

在C#中:

 myHtml = Regex.Replace(myHtml, @"(\s*/\s*(?=[^<>]+<))", " / ");

Perl:

$myHtml =~ s!(\s*/\s*(?=[^<>]+<))! / !g;

在JavaScript中:

myHtml = myHtml.replace(/(\s*\/\s*(?=[^<>]+<))/g, " / ");

注意:

在这些示例中,整个文档必须加载到 myHtml 字符串中。
如果您一次只处理一行,如果标记内或中间标记对中有换行符,则显然不起作用。

其他提示

这并不是正则表达式擅长的事情。使用HTML或XML解析器可能会更好 - 它会从文档中创建一个节点树,然后您可以单步执行标记内的所有文本节点并根据需要添加空格。

如果需要,可以尝试使用正则表达式在两个标记之间提取文本,然后对其进行处理,然后重新插入,但由于您的约束,此任务可能比单个正则表达式更复杂。

这是Perl中有效的东西(但不使用正则表达式):

my (@a, $in_tag);
foreach(split //, $string) { # assuming $string holds our string
  $in_tag = 1 if 

如果需要,可以尝试使用正则表达式在两个标记之间提取文本,然后对其进行处理,然后重新插入,但由于您的约束,此任务可能比单个正则表达式更复杂。

这是Perl中有效的东西(但不使用正则表达式):

<*>

然而,这不是一个正则表达式,而是一个非常简单的解析器。

eq "<"; $in_tag = 0 if

如果需要,可以尝试使用正则表达式在两个标记之间提取文本,然后对其进行处理,然后重新插入,但由于您的约束,此任务可能比单个正则表达式更复杂。

这是Perl中有效的东西(但不使用正则表达式):

<*>

然而,这不是一个正则表达式,而是一个非常简单的解析器。

eq ">"; if(

如果需要,可以尝试使用正则表达式在两个标记之间提取文本,然后对其进行处理,然后重新插入,但由于您的约束,此任务可能比单个正则表达式更复杂。

这是Perl中有效的东西(但不使用正则表达式):

<*>

然而,这不是一个正则表达式,而是一个非常简单的解析器。

eq "/" and not $in_tag) { push @a, " ", "/", " "; } else { push @a,

如果需要,可以尝试使用正则表达式在两个标记之间提取文本,然后对其进行处理,然后重新插入,但由于您的约束,此任务可能比单个正则表达式更复杂。

这是Perl中有效的东西(但不使用正则表达式):

<*>

然而,这不是一个正则表达式,而是一个非常简单的解析器。

; } } $string = join "", @a;

然而,这不是一个正则表达式,而是一个非常简单的解析器。

我认为我们在这里缺乏一点背景。数据是HTML,XML,还是带有标签的文本片段?

如果它是HTML或XML,如常提到的那样,正则表达式并不安全,除非您完全控制数据的格式,并且您知道您将始终控制它。你记录下来了。

如果我是你,我会使用适当的解析器。如果安装了Perl和XML :: Twig,则以下单行程序将执行:

perl -MXML::Twig -e'XML::Twig->parse( keep_spaces => 1, "my_file.xml")->subs_text( "/", " / ")->print'

如果您正在处理格式良好的XML而没有注释而没有CDATA部分,那么更有效的方法是使用PYX(您需要安装XML :: PYX):

pyx my_file.xml | perl -p -e's{/}{ / }g if m{-}' | pyxw

用什么语言? 在Perl中,尝试 s / \ // \ / / g

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top