我的日志文件包含以下内容:
Run Code Online (Sandbox Code Playgroud)2009-03-12T12:44:27+0000 something was logged 2009-03-12T12:45:36+0000 127.0.0.1 127.0.0.1 <auth.info> last message repeated 2 times
我可以编写一个正则表达式来检索带有“最后一条消息重复...”语句的行,但是,如果不检索它前面的行,该行就毫无意义。
话虽这么说,有谁知道一个正则表达式可以让我在检测到“最后一条消息重复...”语句时检索这两行?
我正在回答一些面试的测验问题,问题是如何进行屏幕抓取.也就是说,假设您没有更好的结构化方式直接查询信息(例如Web服务),从网页中挑选内容.
我的解决方案是使用XQuery表达式.表达式相当长,因为我需要的内容在HTML层次结构中非常深入.在找到具有id属性的元素之前,我必须以一种公平的方式搜索祖先.例如,抓取Product Dimensions的Amazon.com页面如下所示:
//a[@id="productDetails"]
/following-sibling::table
//h2[contains(child::text(), "Product Details")]
/following-sibling::div
//li
/b[contains(child::text(), "Product Dimensions:")]
/following-sibling::text()
Run Code Online (Sandbox Code Playgroud)
这是一个非常讨厌的表达,但这就是亚马逊提供Web服务API的原因.无论如何,这只是一个例子.问题不在于亚马逊,而在于屏幕刮擦.
面试官不喜欢我的解决方案.他认为它很脆弱,因为亚马逊改变页面设计可能需要重写XQuery表达式.调试与它所应用的页面中的任何内容都不匹配的XQuery表达式很难.
我并不反对他的陈述,但我认为他的解决方案没有任何改进:他认为最好使用正则表达式,并在运输重量附近搜索内容和标记.例如,使用Perl:
$html =~ m{<li>\s*<b>\s*Product Dimensions:\s*</b>\s*(.*?)</li>}s;
Run Code Online (Sandbox Code Playgroud)
我的反驳是,这也很容易让亚马逊改变他们的HTML代码.他们可能会给在首都(HTML标签<LI>),或者添加CSS属性或更改<b>到<span>或更改标签"产品尺寸:"到"尺寸:"或其他许多种变化.我的观点是正则表达式无法解决他在XQuery解决方案中提到的弱点.
但此外,正则表达式可以找到误报,除非您为表达式添加了足够的上下文.它还可能无意中匹配恰好位于注释,属性字符串或CDATA部分内的内容.
我的问题是,你用什么技术来进行屏幕抓取?你为什么选择这个解决方案?是否有一些令人信服的理由使用它?或者从不使用另一个?除了上面展示的那些之外,还有第三种选择吗?
PS:假设为了论证,没有Web服务API或其他更直接的方式来获取所需内容.
是否有一个术语来表示变量可以假设的所有可能值的集合?
类比:
在数学中,函数的域是一组函数定义的值(函数可以作为参数).
例子:
问:
描述变量可以(上下文)假设的所有可能值的术语是什么?
基本上需要一个简短版本的"变量值集".我已经看到术语类型用于描述这样的范围,但Type通常包含其他信息位(例如名称,操作,模块).
在我的Ruby应用程序中,我使用以下方法和正则表达式从字符串中删除所有HTML标记:
str.gsub(/<\/?[^>]*>/,"")
Run Code Online (Sandbox Code Playgroud)
这个正则表达式完成了我所期待的所有内容,除了它导致所有引号转换为“
所有单引号都要更改为”
.
将杂乱的代码转换回正确的字符时,我错过了哪些显而易见的事情?
编辑:无论有没有正则表达式都会出现问题,所以很明显我的问题与它无关.我现在的问题是如何处理这种格式错误并纠正它.谢谢!
我有一个HtmlTextArea,我想限制用户可以输入的字符数为500.
目前我使用了RegularExpressionValidator ......
RegularExpressiondValidator val = new RegularExpressiondValidator ();
val.ValidationExpression = "^.{0,500}$";
val.ControlToValidate = id;
val.ErrorMessage = "blah";
Run Code Online (Sandbox Code Playgroud)
...当文本输入单行时,这很好,但只要文本包含新行字符(即多行),它就会立即失败验证.
我意识到有不同的正则表达式引擎,我需要用.NET测试一个(有人能指出我在网上的好方向吗?)但我尝试过其他一些东西,包括前置"(?m) "到我的表达式字符串,并用\ A和\ Z替换^和$,但到目前为止没有运气.
另一个相关的问题是,我可以避免使用正则表达式并将此验证器链接到我自己的验证函数吗?
我正在寻找一个Perl正则表达式,它将使任何以空格开头的字符(或字符串中的第一个字符串)大写.
我很确定有一种简单的方法可以做到这一点,但我没有方便的Perl书,我不经常这样做,我记住它...
我想要一个C#的正则表达式,匹配"Johnson","Del Sol"或"Del La Range"; 换句话说,它应该匹配中间空格但在开头或结尾没有空格的单词.
使用AJAX时,我需要一个页面刷新和后退按钮的解决方案.
我正在使用简单的JavaScript来实现AJAX.
如果有人可以发送代码片段,我将非常感激.
我的数据库中有一堆网页内容,链接如下:
<a href="/11ecfdc5-d28d-4121-b1c9-1f898ac0b72e">Link</a>
Run Code Online (Sandbox Code Playgroud)
Guid唯一标识符是同一数据库中另一个页面的ID .
我想抓取这些页面并检查链接是否损坏.
为此,我需要一个可以返回页面上所有Guid列表的函数:
Function FindGuids(ByVal Text As String) As Collections.Generic.List(Of Guid)
...
End Function
我认为这是正则表达式的工作.但是,我不知道语法.