在Java中我需要匹配 没有href属性的字符串标记.例如,在以下字符串中:
text link1 text link2 text
它不应该匹配link1
(因为它包含href)但它应该匹配link2
(因为它不包含href).
我设法构建RegEx以匹配我的标签:
]*>(.*?)
但我无法弄清楚如何用href消除标签
(我知道我可以使用HTML解析器等,但我需要使用RegEx执行此操作.
注意正则表达式,]*
因为这些也将匹配其他有效的html标签,这些标签a
以or或者开头
.另外简单地查找字符串的存在
href
是不够好的,因为该字符串可能在另一个属性的值内,或者像或者是另一个属性的一部分,如
这个表达式将:
匹配所有锚标签...
不包含href
属性.
它会强制标记名称a
,而不是一个标签,该标签简单地用字母开头a
像
忽略属性,这些属性也包含href
嵌入在属性名称中的子字符串,如有效hreflang='en'
或组成Attributehref="some value"
.
忽略所有格式正确的属性的值部分内的所有字符 bogus='href=""'
)(?!(?:[^>=]|=(['"])(?:(?!\1).)*\1)*?\shref=['"])[^>]*>.*?<\/a>
)
匹配open标签并确保标签名称后面的空格或紧密括号,这会强制名称a
而不是其他名称
(?!
如果我们在此标记中找到一个href,那么这个类型的标记不是我们正在寻找的标记
(?:
启动非捕获组以遍历标记内的所有字符
[^>=]
匹配阻止正则表达式引擎离开标记的所有非标记关闭字符,以及阻止引擎继续盲目匹配所有字符的非等号
|
要么
=(['"])
匹配等号后跟开放的双引号或单引号.引用被捕获到组2中,以便以后可以正确配对
(?:(?!\1).)*
匹配所有不是与开放引用匹配的近引号的字符
\1
匹配正确的关闭报价
)*?
关闭非捕获组,并根据需要重复,直到
\shref=['"]
匹配所需的href属性.在\s
和=["']
确保属性名称就是HREF
)
关闭负向前瞻
[^>]*>.*?<\/a>
匹配整个字符串从打开到关闭
Java代码示例:
输入文本
RADIO text link1 text link2 text
码
如果您希望在替换函数中使用它来删除非href-anchor标记,那么只需替换所有匹配项.
import java.util.regex.Pattern; import java.util.regex.Matcher; class Module1{ public static void main(String[] asd){ String sourcestring = "source string to match with pattern"; Pattern re = Pattern.compile(")(?!(?:[^>=]|=(['\"])(?:(?!\\1).)*\\1)*?\\shref=['\"])[^>]*>.*?<\\/a> ",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); Matcher m = re.matcher(sourcestring); int mIdx = 0; while (m.find()){ for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){ System.out.println( "[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx)); } mIdx++; } } }
火柴
$matches Array: ( [0] => Array ( [0] => link2 ) [1] => Array ( [0] => ) )