Html 用于类似wiki标记的正则表达式转换
考虑以下加价输入: * Line 1 * Line 2 :* Line 2.1 :* Line 2.2 * Line 3 更新#1-问题稍微简单一点。巢穴的数量可以限制为三个。对于n能级深的一般解决方案仍然是很酷的 更新#2-XHTML,而不是HTML 更新#3-另一种可能的输入格式 更新#4最受欢迎的是Java解决方案(或纯正则表达式) 更新#5 修订守则:Html 用于类似wiki标记的正则表达式转换,html,regex,xhtml,wiki,user-input,Html,Regex,Xhtml,Wiki,User Input,考虑以下加价输入: * Line 1 * Line 2 :* Line 2.1 :* Line 2.2 * Line 3 更新#1-问题稍微简单一点。巢穴的数量可以限制为三个。对于n能级深的一般解决方案仍然是很酷的 更新#2-XHTML,而不是HTML 更新#3-另一种可能的输入格式 更新#4最受欢迎的是Java解决方案(或纯正则表达式) 更新#5 修订守则: String in = " * Line 1 * Line 2 > * Line 2.1 * Line 2.2 < * Li
String in = " * Line 1 * Line 2 > * Line 2.1 * Line 2.2 < * Line 3";
String sub = "<ul>" + in.replace( " > ", "<ul>" ) + "</ul>";
sub = sub.replace( " < ", "</ul>" );
sub = sub.replaceAll( "( | >)\\* ([^*<>]*)", "<li>$2</li>" );
System.out.println( "Result: " + sub );
String in=“*第1行*第2行>*第2.1行*第2.2行<*第3行”;
字符串sub=“”+in.replace(“>”,“”)+“
”;
sub=sub.替换(“<”,“
”);
sub=sub.replaceAll(“(|>)\\*([^*]*)”,“$2 ”;
System.out.println(“结果:+sub”);
打印以下内容:
Result: <ul><li>Line 1 </li>* Line 2<ul>* Line 2.1<li>Line 2.2</li></ul>* Line 3
结果:- 第1行
*第2行
*第2.1行第2.2行*第3行
我觉得你的例子很好
> Line 1 > Line 2 >> Line 2.1 >> Line 2.2 > Line 3
不幸的是,纯正则表达式无法跟踪您所处的嵌套级别,因此它不知道将/ULclose标记放在哪里
类似的方法可能会奏效:
* Line 1 * Line 2 > * Line 2.1 * Line 2.2 < * Line 3
*第1行*第2行>*第2.1行*第2.2行<*第3行
在这里,“大于”和“小于”在层次结构中上下移动,星号是项目符号的分隔符。每个字符前后的空格都用作一种转义序列,因此,如果这些字符不被空格包围,您仍然可以按字面意思使用这些字符,或者用于其他用途,如斜体和粗体
对RegEx的攻击:
string ol = "<ul>" & RegEx.Replace(t, " > ", "<ul>") & "</ul>";
ol = RegEx.Replace(ol, " < ", "</ul>");
ol = RegEx.Replace(ol, "( |>)\\* ([^*<>]*)", "<li>\\2</li>");
string ol=“”&RegEx.Replace(t,“>”,“”)&“
”;
ol=RegEx.Replace(ol,“<”,“
”;
ol=RegEx.Replace(ol,“(|>)\\*([^*]*)”,“\\2 ”;
编辑:根据下面的评论,调整以生成XHTML,关闭LI标记。还修复了我的C#语法
最终编辑:我认为上一次替换中的\*和\2需要转义为C#,修复。另外,请注意,前两个Replace()调用可以使用String.Replace()而不是RegEx,这可能会更快。我觉得您的示例不错
> Line 1 > Line 2 >> Line 2.1 >> Line 2.2 > Line 3
不幸的是,纯正则表达式无法跟踪您所处的嵌套级别,因此它不知道将/ULclose标记放在哪里
类似的方法可能会奏效:
* Line 1 * Line 2 > * Line 2.1 * Line 2.2 < * Line 3
*第1行*第2行>*第2.1行*第2.2行<*第3行
在这里,“大于”和“小于”在层次结构中上下移动,星号是项目符号的分隔符。每个字符前后的空格都用作一种转义序列,因此,如果这些字符不被空格包围,您仍然可以按字面意思使用这些字符,或者用于其他用途,如斜体和粗体
对RegEx的攻击:
string ol = "<ul>" & RegEx.Replace(t, " > ", "<ul>") & "</ul>";
ol = RegEx.Replace(ol, " < ", "</ul>");
ol = RegEx.Replace(ol, "( |>)\\* ([^*<>]*)", "<li>\\2</li>");
string ol=“”&RegEx.Replace(t,“>”,“”)&“
”;
ol=RegEx.Replace(ol,“<”,“
”;
ol=RegEx.Replace(ol,“(|>)\\*([^*]*)”,“\\2 ”;
编辑:根据下面的评论,调整以生成XHTML,关闭LI标记。还修复了我的C#语法
最终编辑:我认为上一次替换中的\*和\2需要转义为C#,修复。另外,请注意,前两个Replace()调用可以使用String.Replace()而不是RegEx,这可能会更快。我不建议使用正则表达式作为解析和转换工具。正则表达式往往有很高的开销,并且不是解析语言的最有效的方法……这正是您真正要求它做的。您已经创建了一种语言,尽管它很简单,您应该这样对待它。我建议为您的WIKI样式的格式化代码编写一个实际的、专用的解析器。因为您可以将解析器专门针对您的语言,所以它应该更有效。此外,您不必创建一些可怕的怪物,即正则表达式来解析您的语言并处理其所有细微差别。从长远来看,您将获得更清晰的代码、更好的可维护性等好处 我建议提供以下资源:
- $1 ”; in=in.替换(“>>”,“>
- 第1行
- 第2行
- 第2.2行
- 第3行
- $1 ”; in=in.替换(“>>”,“>
- 解决方案
工作解决办法如下:
public class Test {
public Test() {
}
public static void main( String[] args ) {
String in = "= Line 1 = Line 2 > = Line 2.1 = Line 2.2 < = Line 3";
in = in.replaceAll( "= ([^=<>]*)", "<li>$1</li>" );
in = in.replace( ">> ", "><ul>" );
in = in.replace( ">< ", "></ul>" );
in = "<ul>" + in + "</ul>";
System.out.println( in );
}
}
公共类测试{
公开考试(){
}
公共静态void main(字符串[]args){
字符串in=“=第1行=第2行>=第2.1行=第2.2行<=第3行”;
in=in.replaceAll(“=([^=]*)”,“”);
in=in.替换(“><”,“>
”);
in=“”+in+”
”;
系统输出打印项次(输入);
}
}
这将创建所需的XHTML片段:
<ul><li>Line 1 </li><li>Line 2 </li><ul><li>Line 2.1 </li><li>Line 2.2 </li></ul><li>Line 3</li></ul>
第2.1行
解决方案
工作解决办法如下:
public class Test {
public Test() {
}
public static void main( String[] args ) {
String in = "= Line 1 = Line 2 > = Line 2.1 = Line 2.2 < = Line 3";
in = in.replaceAll( "= ([^=<>]*)", "<li>$1</li>" );
in = in.replace( ">> ", "><ul>" );
in = in.replace( ">< ", "></ul>" );
in = "<ul>" + in + "</ul>";
System.out.println( in );
}
}
公共类测试{
公开考试(){
}
公共静态void main(字符串[]args){
字符串in=“=第1行=第2行>=第2.1行=第2.2行<=第3行”;
in=in.replaceAll(“=([^=]*)”,“”);
in=in.替换(“><”,“>
”);
in=“”+in+”
”;
系统输出打印项次(输入);
}
}