【问题标题】:Match strings between specific tags and convert to wikilinks匹配特定标签之间的字符串并转换为维基链接
【发布时间】:2019-09-25 08:33:36
【问题描述】:

这个问题与我在这里问的另一个问题相似:Match strings between delimiting characters 但我无法修改以执行新任务。 (解决方案应该使用 EmEditor 或 Notepad++)

我需要匹配特定标签之间的文本,即<b class="b2">I have a lot of text, more text, some more text, text</b> 然后

  1. 在开始标记后将第一个字符转换为小写(代词“I”除外)
  2. 将逗号之间的内容转换为维基链接(并消除标签)。

我尝试运行多个正则表达式以通过多个步骤来接近这一点,即

(<b class="b2">)(.)
[[\L\2

</b>
]]

(\[\[)(\w+), (\w+)(\]\])
\1\2]], [[\3\4

输入文字:

Any text <b class="b2">I make laugh</b>: Ar. and P. γέλωτα. Some more text <b class="b2">Delight</b>: P. and V. [[τέρπω]].
Any text <b class="b2">I amuse oneself, pass the time</b>: P. διάγειν.
Any text <b class="b2">It amuses oneself with, pass the time over, amuse</b>: Ar. and P.

预期输出:

Any text [[I make laugh]]: Ar. and P. γέλωτα. Some more text [[delight]]: P. and V. [[τέρπω]].
Any text [[I amuse oneself]], [[pass the time]]: P. διάγειν.
Any text [[it amuses oneself with]], [[pass the time over]], [[amuse]]: Ar. and P.

【问题讨论】:

  • (with the exception of the letter "I") - 实际上,它是代词I。你已经举了一个It的例子-> it
  • 这是正确的,谢谢。

标签: regex notepad++ pcre emeditor


【解决方案1】:

这是一步解决方案:

  • Ctrl+H
  • 查找内容:(?:&lt;b class="b2"&gt;|\G(, (?=.*&lt;/b&gt;)))(I )?([^,&lt;]+)(?:&lt;/b&gt;)?
  • 替换为:$1[[$2\l$3]]
  • 检查环绕
  • 检查正则表达式
  • 取消选中. matches newline
  • 全部替换

说明:

(?:                 # non capture group
    <b class="b2">  # literally
  |                 # OR
    \G              # restart from last match position
    (               # group 1, a comma and a space
      ,             # a comma and a space
    (?=.*</b>)      # positive look ahead, make sure we have a closing tag after
    )               # end group 1
)                   # end group
(I )?               # group 2, UPPER I and a space, optional
([^,<]+)            # group 3, 1 or more any character that is not comma or less than
(?:</b>)?           # optional end tag

替换:

$1          # content og group 1 (i.e. comma & space)
[[          # double openning square bracket
$2          # content of group 2, (i.e. "I ")
\l$3        # lowercase the first letter of group 3 (i.e. all character until comma or end tag)
]]          # double closing square bracket

给定示例的结果:

Any text [[I make laugh]]: Ar. and P. γέλωτα. Some more text [[delight]]: P. and V. [[τέρπω]].
Any text [[I amuse oneself]], [[pass the time]]: P. διάγειν.
Any text [[it amuses oneself with]], [[pass the time over]], [[amuse]]: Ar. and P.
[[be at ease]], v.: P. and V. ἡσυχάζειν, V. ἡσύχως ἔχειν.

屏幕截图:

【讨论】:

  • 完美解决方案!
  • 哎呀,好像是在标签之外抓取文字,比如变成这样:&lt;b class="b2"&gt;Be at ease&lt;/b&gt;, v.: P. and V. ἡσυχάζειν, V. ἡσύχως ἔχειν.变成[[be at ease]], [[v.: p. and v. ἡσυχάζειν]], [[v. ἡσύχως ἔχειν.
  • @greektranslator:已修复,请参阅我的编辑,只需在第 1 组末尾添加 (?=.*&lt;/b&gt;)(, (?=.*&lt;/b&gt;))
  • 谢谢,又一个类似的案例。这:&lt;b class="b2"&gt;unknown&lt;/b&gt;, τινί &lt;span class="bibl"&gt;Od.2.175&lt;/span&gt;; &lt;b class="b2"&gt;unheard of, forgotten&lt;/b&gt;, Mimn &lt;span class="bibl"&gt;5.7&lt;/span&gt;[[unknown]], [[τινί ]]&lt;span class="bibl"&gt;Od.2.175&lt;/span&gt;; [[unheard of]], [[forgotten]], [[mimn ]]&lt;span class="bibl"&gt;5.7&lt;/span&gt; 出现所以“τινί”和“mimn”不应该受到影响,但它们确实是。
  • 这有点复杂,将\G(, (?=.*&lt;/b&gt;)) 更改为\G(, (?=(?:(?!&lt;b ).)*&lt;/b&gt;)),它适用于给定的示例。如果您有其他测试用例,请更新您的问题并添加所有测试用例。很难在评论中看到它们。请注意,正则表达式将变得不可读,您可以查看 HTML 解析器。
【解决方案2】:

你应该分几个步骤来做。


替换

<b class="b2">([^<]*)</b>

[[\1]]

&lt;b&gt;标签转换为维基链接。


替换

(\[\[[^,\[\]]*?)(\s*),(\s*)

\1]], [[

将文本标记为维基链接。但是,它可能需要运行多次才能替换所有逗号。见here


替换

\[\[([A-Z])

[[\l\1

确保在 NPPP 中选择“匹配大小写”。

这会将[[ 之后的所有大写字母转换为小写。


替换

\[\[i(\s)

[[I\1

转换以恢复大写开头的代词。

【讨论】:

  • 重点是还有其他包含逗号等的文本我不想修改。
  • 谢谢,看起来好多了,只是第二步在[[之后添加了一个空格,即[[ pass the time]]
  • 在示例中,源文本在逗号后没有空格,即[[scsdfs,asdasda]]。刚刚在 EmEditor 和 Notepad++ 中测试过一样的结果,我仔细复制了文字。
  • 很好,这已经解决了,尽管[[ 之后的第一个字母在某些情况下不是小写的。例如这两个字符串:&lt;b class="b2"&gt;Delight&lt;/b&gt;: P. and V. [[τέρπω|τέρπειν]].&lt;b class="b2"&gt;Amuse oneself, pass the time&lt;/b&gt;: P. διάγειν, Ar. and P. διατρίβειν. 它变成:[[Delight]]: P. and V. [[τέρπω|τέρπειν]].[[Amuse oneself]], [[pass the time]]: P. διάγειν, Ar. and P. διατρίβειν.
  • 并且不应该在后期后期处理阶段更改为小写,因为[[之后还有其他文本(不在标签&lt;b class="b2"中)应该保持不变。
猜你喜欢
  • 2015-04-29
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 2015-03-23
相关资源
最近更新 更多