我试图提出一个正则表达式来查找锚点ID和名称值中存在的空间。
例如,在标记中
<a id="Subsection Two Test One Two Three" name="Subsection Two Test One Two Three">
regex会在引号之间找到空格,但忽略a和id之间以及“和name之间的空格,并忽略标记之外的任何内容。
目标是在Sublime Text中使用正则表达式查找属性值中的空格,并将其替换为下划线。
答案 0 :(得分:0)
您必须使用知道如何匹配标签的正则表达式。
程序:
在源上进行2次全部替换传递。您需要回调以下划线替换空格。
将解释第一个, ID , NAME 是第二遍(过程相同)。
<a(?=\s)(?=((?:[^>"']|"[^"]*"|'[^']*')*?\sid\s*=\s*)(?:(['"])([\S\s]*?)\2)((?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)*?>))\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>
是 ID
的 replace dall 正则表达式解释
# Begin Anchor tag
< a
(?= \s )
(?= # Asserttion (a pseudo atomic group)
( # (1 start), Up to ID attribute
(?: [^>"'] | " [^"]* " | ' [^']* ' )*?
\s id \s* = \s*
) # (1 end)
(?:
( ['"] ) # (2), Quote
( [\S\s]*? ) # (3), ID Value
\2
)
( # (4 start), After ID attribute
(?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )*?
>
) # (4 end)
)
# Have the ID, just match the rest of tag
\s+
(?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+
> # End Anchor tag
在回调中,这些组将连接在一起以形成替换
像这样
//存储捕获的组
$ g1 = match.groups [1];
$ g2 = match.groups [2];
$ g3 = match.groups [3];
$ g4 = match.groups [4];
//从存储的捕获组构造返回字符串
返回"<a" + $g1$g2 +
replaceAll($g3, " ", "_") +
//这是一个regex全局替换函数
$g2$g4;
图例:
组1 =最多ID属性
组2 =值分隔符
组3 = ID值
组4 = ID属性后
回调的Name属性是相同的,请将此正则表达式用于全部替换。
<a(?=\s)(?=((?:[^>"']|"[^"]*"|'[^']*')*?\sname\s*=\s*)(?:(['"])([\S\s]*?)\2)((?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)*?>))\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>
答案 1 :(得分:0)
您可以使用以下正则表达式用空字符串替换Spaces(您的正则表达式引擎必须支持look behind
和look ahead
):
/(?<!\<a)(?<=\w)\s(?=\w)/g
正则表达式首先为negative look behind
制作一个'<a'
。
然后,它为look behind
生成一个正数Word character
,然后与一个White space
匹配一个looks ahead
,最后匹配一个Word
字符。{p>
现在replace
与empty string
的比赛。