我正在尝试找到一个正则表达式,该正则表达式可以找到以下所有标签:
这是我目前拥有的:
(?<!<noparse>)<(?!(\/?(noparse|u))).*?>(?!<\/noparse>)
如果我输入以下内容
<u><b>test2</b></u>
<noparse><u><b>test</b></u></noparse>
<noparse><b>test</b></noparse>
它将匹配
<b> & </b> (correct, not surrounded by <noparse></noparse>, <u></u> is allowed)
<b> & </b> (incorrect, surrounded by <noparse></noparse>)
</b></noparse> (incorrect, surrounded by <noparse></noparse>)
但是,我希望它与之匹配
<b> & </b>
{nothing}
{nothing}
您可以在此处查看: https://regex101.com/r/HO1Bo2/1
我想这样做,以便可以清理字符串。我们的应用程序是在Unity中制作的,并使用TextMeshPro来显示文本。 TMP支持很多标签,所有标签都可以在这里找到:http://digitalnativestudios.com/textmeshpro/docs/rich-text/。我们只希望允许使用其中几个标签,因为用户可能会变得太有创意,并开始混淆行高,偏移量,字体大小等。我们还希望使用该标签,以便用户可以用它包围任何受支持的标签,以使其显示为纯文本。
预先感谢,我敢肯定周围有比我聪明的人!
您, 巴斯
答案 0 :(得分:0)
最后我走了一条不同的路,因为Regex在这种情况下确实无法解决问题。
用规范化格式项替换输入字符串中的所有现有格式项,并备份所述列表中的原始格式项。
<b>test</b> {56} <noparse><b>test</b></noparse> {3}
becomes
<b>test</b> {0} <noparse><b>test</b></noparse> {1}
用标准格式项替换所有现有的...块,并将它们添加到同一列表中。
<b>test</b> {0} <noparse><b>test</b></noparse> {1}
becomes
<b>test</b> {0} {2} {1}
使用以下正则表达式检索剩余字符串中所有不受支持的标签并清理:
<(?!(\/?(u|i))).*?>
在这种情况下,以下标记是受支持的标记,所有其他标记将由正则表达式找到:
<u></u><i></i>
使用noparse标签包围所有不受支持的标签会导致以下字符串:
<b>test</b> {0} {2} {1}
becomes
<noparse><b></noparse>test<noparse></b></noparse> {0} {2} {1}
现在我们可以再次用其原始文本替换所有格式项
string sanitizedString = string.Format(sanitizedStringBuilder.ToString(), replacedStrings.ToArray());
结果:
<noparse><b></noparse>test<noparse></b></noparse> {56} <noparse><b>test</b></noparse> {3}
似乎工作得非常好,尽管有很多步骤,但我对此解决方案感到非常满意。