搜档网
当前位置:搜档网 › 在ReportingServices+中使用表达式

在ReportingServices+中使用表达式

在ReportingServices+中使用表达式
在ReportingServices+中使用表达式

在Reporting Services 中使用表达式

已更新:2005 年12 月 5 日

表达式在整个报表定义过程中被广泛用于检索、计算、显示、分组、排序、筛选、参数化以及格式化报表内容。有些表达式是自动创建的(例如,将字段从数据集窗口拖动到表单元格时,检索该字段值的表达式将显示在文本框中)。但是,在大多数情况下,需要创建自己的表达式以便在报表中获取下列功能类型:

?数据的聚合,以显示特定行集的总和、平均值、百分比或乘积。

?条件格式,其中文本或背景的格式随定义的逻辑而更改。

?条件文本,其中报表标题随运行报表人员的改变而改变。

?来自多个数据集字段和常量的连接文本。

?从数据源中检索后又经过筛选的报表数据。

?参数化钻取报表。

?数据分组和排序。

?动态页眉和页脚内容。

在Reporting Services 中,了解如何创建并使用表达式是一项基本技能,通过此项技能您可以创建丰富且功能完备的报表。表达式以Microsoft Visual Basic 语言编写。有关多个表达式示例的列表,请参阅在Reporting Services 中使用表达式。

本节内容

在Reporting Services 中使用表达式

介绍表达式并讨论它们在报表中的应用位置。

在Reporting Services 中创建表达式

介绍如何创建表达式。

在表达式中使用全局集合(Reporting Services)

介绍在表达式中引用全局集合。

在表达式中使用报表函数(Reporting Services)

介绍在表达式中引用内置报表功能。

在表达式中使用自定义代码引用(Reporting Services)

介绍在表达式中引用自定义代码、自定义报表项以及自定义程序集。

为Analysis Services 数据库使用扩展字段属性

介绍Analysis Services 数据扩展插件提供的自定义字段属性。

Reporting Services 中的表达式示例

提供常用表达式示例。

在Reporting Services 中使用表达式

新建日期:2005 年12 月5 日

在Reporting Services 中,表达式用于动态地、灵活地控制报表的内容和外观。有些表达式是自动创建的。例如,当创建新报表并将字段从数据集拖动到报表项时,文本框的值将自动设置为按名称引用数据集字段的表达式。在报表处理过程中,每个表达式都计算出在报表呈现时可替换该表达式的一个值。同时,在整个报表定义过程中,表达式还被用来指定或计算报表项属性、文本框属性、参数、查询、书签、文档结构图、筛选器以及分组和排序定义的值。

可以在文本框、属性窗口中输入文本或通过对话框创建报表项的表达式。表达式是以Microsoft Visual Basic 编写的。表达式以等号(=) 开头,其中包括对常量、运算符、函数以及包含字段和参数的内置报表全局集合的引用。也可以创建对报表处理以外

的 .NET Framework 类、自定义代码以及程序集的引用。有关创建表达式的详细信息,请参阅在Reporting Services 中创建表达式。

本主题概述了报表定义中可使用表达式的位置。本主题中的示例以创建基本报表教程中所创建的AdventureWorks 数据集为基础。若要从这些示例开始学习,请参阅Reporting Services 中的表达式示例。

使用字段表达式

可以使用表达式引用数据集中的字段,并在文本框中显示它的值。若要将检索的数据与报表项进行关联,字段表达式必须使用Fields 全局集合、字段名称和Value 属性。

?如果将字段从数据集窗口拖动到报表项,则字段表达式将自动添加到文本框中。

示例:

=Fields!LastName.Value

结果:

Reiter

Reiter

Saraiva

?可以将多个字段或常量中的数据进行组合。

示例:

=Fields!FirstName.Value & " " & Fields!LastName.Value

结果:

Tsvi Reiter

Tsvi Reiter

Jose Saraiva

有关可在表达式中使用的所有引用类型的列表,请参阅在Reporting Services 中创建表达式。

使用

Reporting Services 内置函数

您可使用表达式引用大量来自表达式的内置报表函数。这些函数既包括Sum、Min、Max 和Count 之类的用于计算行分组值的标准聚合函数,也包括RowNumber 和RunningValue 之类的在详细信息行中使用以提供每行的值的函数。

?使用聚合函数Count 计算名为SalesOrder 的数据集的LastName 字段中的姓氏数目。尽管可将表达式放在表的详细信息行中,但还是会看到在3906 行的每一行中都输入了相同的值。聚合函数旨在用于汇总详细信息行,通

常在数据区域或数据区域分组的表头行或表尾行的文本框中使用。

示例:

="Number of Names: " & Count(Fields!LastName.Value)

结果:

Number of Names: 3906

?使用聚合函数Sum 汇总TotalDue 字段。将其放在表的表尾行中。请注意,此值未设置格式。

示例:

="Total Sold: " & Sum(Fields!TotalDue.Value)

结果:

Total Sold: 108266245.7018

?使用Format 函数和Microsoft .NET Framework 格式设置字符串C设置数值的格式。

示例:

="Total Sold: " & Format(Sum(Fields!TotalDue.Value),"C")

结果:

Total Sold: $108,266,245.70

?使用RowNumber 函数计算行数。

示例:

=RowNumber(Nothing)

结果:

1

2

3

使用RunningValue 聚合指定范围内的运行总计。

示例:

=Format(RunningValue(Fields!TotalDue.Value,Sum,Nothing),"C")

结果:

$27,231.55

$28,947.73

有关可从表达式中引用的报表内置函数的完整列表,请参阅在表达式中使用报表函数(Reporting Services)。

作用域

因为可能已经定义了多个组,所以可指定聚合函数将使用的作用域。作用域是可传递给聚合函数以指示如何计算聚合的名称。例如,对于定义了多个组的表,可能需要从内部组表头行引用外部组。Nothing 作用域将通知函数使用最外面的作用域。对于没有分组的简单表数据区域,只有一个作用域。

若要标识对于报表项分组有效的作用域,请打开“属性”对话框,单击“分组”选项卡,查看可用于标识作用域的组标签列表。

使用

.NET Framework 和系统命名空间

可使用表达式引用Microsoft.VisualBasic 运行时库的内置命名空间、.NET Framework 命名空间System.Convert 和System.Math。若要引用其他 .NET Framework CLR(公共语言运行时)命名空间,必须使用完全限定的命名空间,例如System.Text.StringBuilder。对于外部程序集的引用,则需要通过报表属性来标识程序集,并确保可在报表服务器中使用此程序集。有关详细信息,请参阅如何向报表添加程序集引用(报表设计器)和Referencing Assemblies in an RDL File。

使用自定义代码和类引用

可使用表达式引用自己的自定义实例和类实例。为此,可通过报表属性将代码直接添加到报表中,或生成自定义程序集,然后从表达式内部引用此程序集。有关详细信息,请参阅在表达式中使用自定义代码引用(Reporting Services)。

使用条件格式

可以使用表达式来控制报表项的外观。例如,可以为用于以不同颜色(具体取决于数据)显示数据的文本框的Color 属性编写表达式。下面的示例中,如果TotalDue 字段中的值小于10000,则将以红色显示此值。如果条件不满足,则文本显示为黑色。

复制代码

=Iif(Fields!TotalDue.Value < 10000,"Red","Black")

若要为报表项输入格式设置表达式,请打开“属性”窗口,针对要设置格式的属性,在值字段中键入表达式。有关条件格式的详细信息,请参阅添加条件格式。

使用查询表达式

可使用表达式定义包含在数据集内的查询。您可以使用此功能来设计报表,报表中的查询可以根据用户的输入、其他数据集中的数据或其他变量进行更改。有关查询的详细信息,请参阅定义报表数据集。

使用筛选、分组和排序表达式

可使用表达式定义筛选器,从而限制报表中显示的数据量和数据类型。筛选器应用于从数据源中检索的数据。您可以针对数据集、数据区域和数据区域分组定义筛选器。有关筛选的详细信息,请参阅如何添加筛选器(报表设计器)和筛选报表中的数据。

可使用表达式为数据区域定义组。您经常使用表达式计算分组数据的聚合。可通过在数据区域上创建组头来定义组。有关分组数据的详细信息,请参阅对报表中的数据进行分组和如何向表中添加组(报表设计器)。

可使用表达式定义数据区域的排序。可对数据集、数据区域上的详细信息行和分组进行排序。有关数据排序的详细信息,请参阅在报表是对数据进行排序和如何对表中的数据进行排序(报表设计器)。

使用内置报表集合

可使用表达式引用内置报表集合类。除了前面介绍的Fields 集合,还可创建引用下列集合中各项的表达式:Globals、User、Parameters、ReportItems、DataSets 和DataSources。当在表达式中使用时,这些集合可访问在报表处理过程中动态确定的报表属性和数据。有关详细信息,请参阅在表达式中使用全局集合(Reporting Services)。

使用区域设置

您可以使用表达式通过https://www.sodocs.net/doc/1a8229957.html,nguage 值来引用客户机上的区域设置,从而确定如何向用户显示报表。例如,可创建基于区域值而使用不同查询表达式的报表。查询可以根据返回的语言发生相应更改,从不同的列中检索本地化信息。您还可以根据此变量在报表或报表项的语言设置中使用表达式。

注意:

如何添加表达式(报表设计器)

已更新:2005 年12 月 5 日

表达式将用在报表项属性、筛选器、组定义、排序定义、连接字符串、查询和报表参数的整个报表定义中。表达式使用常用语法和常用用户界面元素,这些用户界面元素有助于您识别属性何时可为表达式。在您编辑表达式时,表达式编辑器提供Intellisense 说明和语法检查。

表达式可以使用常量、全局集合、内置和外部函数引用以及自定义代码和类实例。表达式编辑器提供有关表达式元素的上下文相关信息。如果要为其编写表达式的报表项或报表对象属性不同,则可用于表达式元素的信息种类也会有所不同。

有关表达式编辑器的详细信息,请参阅编辑表达式(报表设计器)和在Reporting Services 中创建表达式。有关表达式和报表的详细信息,请参阅在Reporting Services 中使用表达式。

不使用表达式编辑器在文本框中添加表达式

1.在“布局”视图中,单击要为其添加表达式的文本框。

2.再次单击该文本框,然后在文本框中键入表达式。

也可以在“属性”窗口(从“视图”菜单中,单击“属性”窗口)或“属性”对话框(右键单击该文本框,然后从上下文菜单中选择“属性”)的“值”属性中键入表达式。

在Reporting Services 中创建表达式

新建日期:2005 年12 月5 日

在Reporting Services 中,表达式说明数据或属性值。表达式用于控制报表的内容和外观。

表达式以等号(=) 开头,后跟字段标识符、常量、函数和运算符的组合。表达式由报表处理器求值,并生成替换该表达式的单个数据值。

如何创建表达式

可以通过“编辑表达式”对话框在报表定义中创建表达式,也可通过将表达式语法直接键入文本框、“属性”窗口属性值字段或者组或排序表达式字段来创建表达式。“编辑表达式”对话框提供上下文相关的全局集合项选项、语句完成、语法检查以及一个较大的工作区域。下图显示了“编辑表达式”对话框。

在许多属性文本框或对话框字段中,可以从下拉列表中选择<“表达式”>,如下图所示。

可以右键单击文本框和其他报表项以显示快捷菜单,然后单击“表达式”,如下图所示。

在某些对话框中,可以使用fx 按钮设置属性值。例如,在报表项“表属性”对话框中的“常规”选项卡上,可以使用fx 按钮来设置工具提示。

有关“编辑表达式”对话框的详细信息,请参阅如何添加表达式(报表设计器)和编辑表达式(报表设计器)。

有效的表达式引用

下表显示了可以包含在报表表达式中的引用类型。该表指示哪些引用是内置的,哪些引用必须标识到报表处理器以便可以在处理报表期间对函数调用进行解析。

有关示例,请参阅 Reporting Services 中的表达式示例。

在表达式中使用全局集合 (Reporting Services)

已更新: 2006 年 4 月 14 日

Reporting Services 提供了下列可以从表达式中引用的全局集合:DataSources 、DataSets 、Fields 、Globals 、Parameters 、ReportItems 和

User 。若要从表达式中引用集合,可以将标准 Visual Basic 语法用于集合中的项。下面的列表提供了此语法的示例:

?

Collection!ObjectName.Property 或 Collection!ObjectName("Property")

=Fields!Sales.Value =Fields!Sales("Value")

?

Collection("ObjectName").Property

=Fields("Sales").Value

?

Collection("Member")

=User("Language")

?

Collection.Member

=https://www.sodocs.net/doc/1a8229957.html,nguage

全局集合摘要

下表说明了可以从表达式中引用集合时的每一个全局集合和注释。在本节的后面主题中将单独讨论每一个全局集合。

页眉或页脚中包含的文本框)集合。在报表处理过程中可用。

Globals

=Globals.ReportName

表示对报表有用的全集变量,如报表名称或页码。始终可用。

Parameters =Parameters("ReportMonth").Value

- 或 -

=Parameters!ReportYear.Value

表示报表参数的集合,每一个参数都可以为单值或多值。直到处理初始化完成之后才可用。创建查询参数时,它们将自动添加到报表参数集合中。

User

=https://www.sodocs.net/doc/1a8229957.html,erID - 或 -

https://www.sodocs.net/doc/1a8229957.html,nguage

表示与运行报表的用户有关的数据的集合,如语言设置或用户 ID 。始终可用。

User!UserID 经常用于在报表中

筛选结果。

DataSources

=DataSources("AdventureWorks").Type

表示从报表的主体中引用的数据源集合。不包括仅在页眉或页脚中使用的数据源。无法在本地预览中使用。

DataSets

=DataSets("TopEmployees").CommandText 表示从报表定义的主体中引用的数据集的

集合。不包括仅在页眉或页脚中使用的数据源。无法在本地预览中使用。

Globals 和 Users 集合的成员将返回变量。如果要在表达式中使用要求特定数据类型的全局变量,则必须先转换该变量。例如,若要将执行时间变量转换为数据格式,请使用 CDate(Globals!ExecutionTime)。有关详细信息,请参阅Reporting Services 中的表达式示例。

字段

报表中的每个数据集都包含一个 Fields 集合。这是您在“数据集”窗口中展开数据集节点时看到的字段集合。该 Fields 集合通常用于显示报表的文本框中的数据,但也可以用于其他报表项、属性和函数中。字段名称在一个集合内必须唯一,不过同一字段名称可以在多个集合中存在。

某些数据处理扩展插件会自动确定为数据集定义的查询中的字段集合。单击工具栏上的“刷新字段”按钮时,更改将被保存到报表定义中,并且“数据集”窗口会被更新,以显示这些更改。若要编辑字段定义,请在报表设计器的“数据”视图中选择数据集,以打开“数据集”对话框,然后单击“字段”选项卡。若要添加计算字段,请右键单击“数据集”窗口中的数据集,以打开“添加新字段”对话框,并键入名称。然后单击“计算字段”并输入表达式。

处理报表期间,由于每个报表项是轮流进行处理的,因此与当前报表项关联的 Fields 集合绑定至基础源数据。处理报表时,为特定字段返回的数据可以是单个值,也可以是与数据集中的每一行对应的值。获得单个值还是多个值由包含字段引用的报表项类型确定。数据区域(表、矩阵、列表或图表)中的引用为数据集中的每一行都返回一个值。不是数据区域一部分的引用返回单个值。 使用聚合报表函数处理数据集中的字段集合时,可以包括用于指定数据集的 scope 参数。若要验证报表项与数据集的关联,请选择报表项并查看其属性。有关报表函数和作用域参数的详细信息,请参阅在表达式中使用报表函数 (Reporting Services)。

默认情况下,Fields 集合中的项有两个属性:Value 和IsMissing。将某一字段从“数据集”窗口拖至报表布局的报表项上时,默认情况下,报表项的内容将设置为该字段的Value 属性。对于数据区域,数据集中的每一行的值都被设置为

=Fields!FieldName.Value。不属于数据区域的报表项的内容被设置为单个值,如

=First(Fields!FieldName.Value)。

IsMissing 属性指示为数据集定义的字段是否包含于从数据源检索的字段中。可以使用Visual Basic 在字段表达式中对此字段进行测试。缺失字段的Value 属性为空(在Visual Basic 中为Nothing)。下面的示例(置于要用于显示字段数据的报表项文本框中时)说明如何测试缺失的字段:

=IIF(Fields!FieldName.IsMissing, "Field was not returned by query", Fields!FieldName.Value))

由于Visual Basic 函数IIF 先计算语句的所有元素,然后返回结果,因此对缺失字段的引用可能会导致处理错误。下面的示例说明如何创建引用可能缺失字段的Visual Basic 函数调用:

=IIF(Sum(Fields!FieldName.Value) IS NOTHING, 0,

Sum(Fields!FieldName.Value))

使用表达式编辑器帮助生成引用字段的表达式时,可以选择第一个窗格中的Fields 集合,并查看最后一个窗格中的可用字段列表。下图显示了名为Employees 的数据集的字段FirstName。

注意IntelliSense 窗口中可用的属性列表。此列表包括默认属性Value 和IsMissing。其余的属性是其他数据处理扩展插件支持的预定义扩展字段属性。

扩展字段属性

扩展字段属性是由数据处理扩展插件在字段中定义的附加属性。扩展字段属性的子集是预定义的。预定义属性是常用的字段属性。Key 字段和UniqueName 字段是典型示例。这些预定义属性出现在IntelliSense 列表中,而且可以使用集合语法

Fields!FieldName.Property进行引用。数据处理扩展插件可以选择通过优化包括此语法的查询来充分利用预定义属性。

您还可以引用受特定数据处理扩展插件支持的其他扩展字段属性。这些属性不会出现在“表达式”窗口中,但是可以通过浏览数据源(通过已注册的数据处理扩展插件及其关联的查询设计器)来加以确定。任何扩展字段属性均可使用集合语法

Fields!FieldName("Property")进行引用。

如果数据访问接口不支持扩展字段属性,或在执行查询时找不到该字段,则属性的类型为String 和Object 时,属性值为null (在Visual Basic 中为Nothing);属性的类型为Integer 时,属性值为零(0)。

如果数据扩展插件提供了自定义字段属性,则无论字段是否支持此属性,对于数据集中的所有字段,这些属性都将在表达式编辑器的下拉列表中可见。如果向此字段不支持的属性添加引用,则引用取值为null(在Visual Basic 中为Nothing)。有关支持扩展字段属性的访问接口的示例,请参阅为Analysis Services 多维数据和数据挖掘预测数据定义报表数据集和为SAP NetWeaver BI 系统中的多维数据定义报表数据集。

Globals

Globals 集合包含报表的全局变量。下表对Globals 集合的成员进行了说明。

全局变量的示例如下:

?此表达式位于报表表尾的文本框中,提供了报表的页码和总页数:

=Globals.PageNumber & " of " & Globals.TotalPages ?此表达式提供了报表的名称以及运行时间。其时间格式为短日期形式的Microsoft .NET Framework 格式设置字符串:

=Globals.ReportName & ", dated " & Format(Globals.ExecutionTime, "d")

Parameters

Parameters 集合包含报表中的报表参数对象。参数可以传递给查询,也可以用在筛选器中,或用在根据该参数改变报表外观和内容的其他函数中。定义查询参数时,它们将自动添加到报表参数集合中。下表说明了Parameter 中定义的属性:Count、IsMultiValue、Value 和Label。

参数既可以通过属性语法访问,也可以通过集合语法访问。以下表达式显示了如何访问Parameters 集合的每一个成员,以及当放置在报表项的文本框中时如何显示参数ProductSubCategory 的内容。

复制代码

="IsMultiValue: " &

Parameters!ProductSubCategory.IsMultiValue.ToString() & " Count:"

& Parameters!ProductSubCategory.Count & " Values: " &

Join(Parameters!ProductSubCategory.Value,", ") & " Labels: " &

Join(Parameters!https://www.sodocs.net/doc/1a8229957.html,bel,", ")

有关详细信息,请参阅在Reporting Services 中使用参数。

ReportItems

ReportItems 集合包含报表内的文本框。ReportItems 集合内的项只有一个属性:Value。ReportItems 项的值可以用于显示或计算报表中其他字段的数据。若要访问当前文本框的值,可以使用Visual Basic 内置全局Me.Value 或仅使用Value。但是,在报表函数(如First)和聚合函数中应使用完全限定语法。

例如:

?以下表达式位于文本框中,显示名为Textbox1 的ReportItem 文本框的值:

=ReportItems("Textbox1").Value

?以下表达式放置在ReportItem 文本框Color 属性中,在值为> 0 时以黑色显示文本,否则将以红色显示文本:=iif(Me.Value > 0,"Black","Red")

?以下表达式放置在页眉或页脚内的文本框中,显示呈现的报表每一页中名为LastName 的文本框的第一个值:=First(ReportItems("LastName").Value)

User

User 集合包含运行报表的用户的有关数据。您可以使用此集合筛选报表中显示的数据,例如仅显示当前用户的数据或显示UserID (如在报表标题中)。以下表达式放置在文本框中,将静态文本与变量用户数据组合起来:

=Globals!ReportName & " for " & User!UserID

下表对User 集合的成员进行了说明。

在某些情况下,包含User!UserID 变量的报表将无法显示专用于查看报表的当前用户的报表数据。为了防止出现此问题,必须满足下列条件:

?报表必须是报表执行快照或报表历史快照。

?报表必须通过SOAP 方法或通过报表URL 地址以编程的方式进行访问。

当出现此问题时,报表快照中的用户配置文件信息将以下列两项之一为基础:

?创建报表快照的用户的标识。

?快照由报表服务器作为预定操作创建后报表服务器运行所用的帐户。

重要事项:

仅当通过SOAP 调用或通过报表快照的UR L 地址打开报表快照时,用户配置文件才会出现问题。对于按需运行的报表以及所有通过报表管理器打开的报表快照,User!UserID 可以完全正常运行。有关如何使用Web 服务方法和UR L 访问调用报表快照的详细信息,请参阅Using a URL to Access Report Server Items和Identifying Execution State。

DataSources

DataSources 集合表示在已发布的报表定义中引用的数据源。在预览模式中获取的这些属性的值可能会不同于部署和查看已发布的报表时获取的值。

下表对DataSources 集合中的变量进行了说明。

数据集

DataSets 集合表示在报表定义中引用的数据集。此全局集合很少直接在报表中使用,但可用于报表设计器,以便访问用于从数据源中为每个数据集检索数据的查询命令。

下表对DataSets 集合的成员进行了说明。

在表达式中使用报表函数(Reporting Services)

您可以在表达式中使用内置函数来处理报表中的报表项、属性和其他区域中的数据。内置函数用于聚合数据集、数据区域和组中的数据以及返回其他数据。

聚合函数

下表对Reporting Services 支持的各种聚合函数进行了说明。可以在任何报表项的表达式中使用聚合函数。

Scope

每个聚合函数都要使用Scope 参数,该参数定义执行聚合函数的作用域。有效的作用域为分组、数据集或数据区域的名称。只有直接或间接包含表达式的分组或数据区域才能作为作用域。对于数据区域中的表达式,Scope 对于所有聚合函数都是可选的。如果

未指定Scope 参数,则聚合的作用域为报表项所属的最内层数据区域或分组。如果作用域指定为Nothing,则将把作用域设置为报表项所属的最外层数据区域。

对于数据区域以外的表达式,Scope 将引用数据集。如果报表包含多个数据集,则Scope 是必需的。如果报表只包含一个数据集并且未指定Scope,则作用域将设置为该数据集。对于数据区域以外的报表项,不能指定Nothing 关键字。

不能在表头或表尾中使用Scope 参数。

其他函数

Reporting Services 提供了下列其他一些聚合函数供您在表达式中使用。有关计算表达式时可以使用的函数类型的完整列表,请参阅在Reporting Services 中创建表达式。

在表达式中使用自定义代码引用(Reporting Services)

已更新:2006 年 4 月14 日

您可以向报表添加自定义函数,或添加对外部程序集中存在的函数的引用。对于Microsoft.VisualBasic、System.Convert 和System.Math 程序集,报表服务器会自动添加引用。对于其他程序集,可以使用“报表属性”对话框或在报表定义中使用CodeModules 元素进行引用。

“报表属性”对话框也可以用于定义新的自定义函数。若要在报表定义中定义自定义函数,请使用Code 元素。但是,无法向函数传递数据值集;特别要指出的是,不支持自定义聚合。

您可以编写自定义代码,在整个报表内的表达式中使用。可以采用以下两种方法执行此操作:在报表中嵌入代码或引用自定义程序集中的方法。对于复杂的函数,或在一个报表中多次使用的函数,可使用嵌入代码。若要在一个位置维护代码,或在多个报表间共享代码,则可以使用代码程序集。

嵌入代码

若要在报表中使用代码,可向报表中添加代码块。代码块可以包含多个方法。嵌入代码中的方法必须采用Microsoft Visual Basic 编写,并且必须是基于实例的方法。

有关如何在报表中添加代码的详细信息,请参阅如何向报表添加代码(报表设计器)。

嵌入代码中的方法可通过全局定义的Code 成员使用。您可以通过引用Code 成员和方法名称来访问这些方法。下面的示例调用ToUSD 方法,该方法将StandardCost 字段中的值转换为美元值:

复制代码

=Code.ToUSD(Fields!StandardCost.Value)

若要引用自定义代码中的全局集合,请包含对内置Report 对象的引用:

复制代码

=Report.Parameters!Param1

下面的示例显示如何定义某些自定义常量和变量。

复制代码

Public Const MyNote = "Authored by Bob" Public Const NCopies As Int32

= 2 Public Dim MyVersion As String = "123.456" Public Dim MyDoubleVersion As Double = 123.456

尽管自定义常量不会出现在“表达式编辑器常量”视图(仅显示内置常量)中,但是可以从任何表达式向其中添加引用,如下面的示例所示。在表达式中,自定义常量被视为Variant。

复制代码

=Code.MyNote =Code.NCopies =Code.MyVersion =Code.MyDoubleVersion

下面的示例包括函数FixSpelling 的代码引用和代码实现,该函数用Bicycle替换SubCategory 字段值中出现的所有Bike文本。

=Code.FixSpelling(Fields!SubCategory.Value)

嵌入报表定义之后,以下代码显示FixSpelling 方法的实现。此自定义代码首次运行时,消息框将显示已替换的文本。此示例显示了如何引用Microsoft .NET Framework StringBuilder 类和System.Windows.Forms.MessageBox 类。您需要为System.Windows.Forms 向报表属性添加引用。有关详细信息,请参阅如何向报表添加代码(报表设计器)和如何向报表添加程序集引用(报表设计器)。

Visual Basic

复制代码

Dim firstTime As Boolean = True Public Function FixSpelling(ByVal

s As String) As String Dim strBuilder As New

System.Text.StringBuilder(s) If s.Contains("Bike") Then

strBuilder.Replace("Bike", "Bicycle") If firstTime Then

System.Windows.Forms.MessageBox.Show(strBuilder.ToString()) ' or MsgBox(strBuilder.ToString()) firstTime = False End If Return strBuilder.ToString() Else : Return s End If End Function

有关全局对象集合以及初始化的详细信息,请参阅在表达式中使用全局集合和Initializing Custom Assembly Objects。

自定义程序集

若要在报表中使用自定义程序集,您必须先创建程序集,使其可供报表设计器使用,然后在报表中添加对该程序集的引用,最后在报表中使用表达式来引用该程序集中包含的方法。如果报表部署到报表服务器,您还必须向报表服务器部署该自定义程序集。

有关创建自定义程序集并使其可供Reporting Services 使用的信息,请参阅Using Custom Assemblies with Reports。有关如何在报表中添加引用的说明,请参阅如何向报表添加程序集引用(报表设计器)。

若要在表达式中引用自定义代码,您必须调用自定义程序集中某个类的成员。调用方式取决于该方法是静态方法还是基于实例的方法。自定义程序集中的静态方法可在报表内全局使用。您可以在表达式中通过指定命名空间、类和方法名称来访问静态方法。下面的示例调用ToGBP 方法,该方法将StandardCost 的值从美元转换为英镑:

复制代码

=CurrencyConversion.DollarCurrencyConversion.ToGBP(Fields!Standa rdCost.Value)

基于实例的方法可通过全局定义的Code 成员使用。您可以通过先引用Code 成员,再引用实例和方法名称,来访问这些方法。下面的示例调用实例方法ToEUR,该方法将StandardCost 的值从美元转换为欧元:

复制代码

注意:

Reporting Services 中的表达式示例

已更新:2006 年 4 月14 日

有些表达式在报表中很常用。其中包括更改报表中的数据外观、更改报表项属性以及影响数据检索方式的表达式。本主题介绍了一些可用于报表中常见任务的表达式。有关详细信息,请参阅在Reporting Services 中创建表达式。

函数

报表中的许多表达式都包含函数。您可以使用这些函数来设置数据格式、应用逻辑和访问报表元数据。您可以编写使用Visual Basic 运行时库、System.Convert和System.Math命名空间中的函数的表达式。您可以从其他程序集或自定义代码中向函数添加引用。还可以使用Microsoft .NET Framework 中的类,包括System.Text.RegularExpressions。有关表达式中所支持的Visual Basic 函数的详细信息,请参阅https://www.sodocs.net/doc/1a8229957.html, 上的“Visual Basic 运行时库”。

Visual Basic 函数

您可以使用Microsoft Visual Basic 函数来处理文本框中所显示的数据,或者处理参数、属性或报表其他区域中所用的数据。本部分举例说明了其中的一些函数。有关Visual Basic 函数的详细信息,请参阅Visual Basic 文档。

日期函数

您可以使用Visual Basic 函数在报表中提供日期信息。

?下面的表达式包含提供当前日期的Today 函数。此表达式可用在文本框中以在报表上显示日期,或用在参数中以根据当前日期筛选数据。

复制代码

=Today()

?若要基于单个参数提供日期范围,可使用DateAdd 函数。下面的表达式提供StartDate 参数中的日期之后六个月的日期:

复制代码

=DateAdd(DateInterval.Month, 6, Parameters!StartDate.Value)

?下面的表达式包含显示特定日期所属年份的Year 函数。您可以使用此表达式将日期组合在一起,或者将年份显示为一组日期的标签。此表达式可以为给定顺序的一组日期提供年份。Month 函数和其他函数也可用于日期操作。有关详细信息,请参阅Visual Basic .NET 文档。

复制代码

=Year(Fields!OrderDate.Value)

字符串函数

您可以使用Visual Basic 函数处理报表中的字符串。

?您可以使用串联运算符和Visual Basic 常量来组合多个字段。以下表达式返回两个字段,分别位于同一文本框的单独行中。

复制代码

=Fields!FirstName.Value & vbCrLf & Fields!LastName.Value

?可以使用Format 函数来设置字符串中日期和数字的格式。下面的表达式以长日期格式显示StartDate 和EndDate 参数的值:

复制代码

=Format(Parameters!StartDate.Value, "D") & " through " & Format(Parameters!EndDate.Value, "D")

如果文本框仅包含日期或数字,则应使用文本框的Format 属性(而不是在文本框中使用Format 函数)来应用格式设置。

?Right、Len 和InStr 函数可用于返回子字符串,例如,修整DOMAIN\username 以便仅返回用户名。下面的表达式从名为User 的参数返回反斜杠(\) 字符右侧的字符串部分:

复制代码

=Right(Parameters!User.Value, Len(Parameters!User.Value) - InStr(Parameters!User.Value, "\"))

下面的表达式使用 .NET Framework String 类的成员而不使用Visual Basic 函数,可以得到与上一个表达式相同的值:复制代码

=Parameters!User.Value.Substring(Parameters!User.Value.IndexOf("\")+1,

Parameters!User.Value.Length-Parameters!User.Value.IndexOf("\")-1)

?可以显示多值参数中选定的值。下面的示例使用Join 函数将参数MySelection 的选定值串联到单个字符串中,可以将该字符串设置为报表项中的文本框值的表达式。

复制代码

= Join(Parameters!MySelection.Value)

如果文本框仅包含日期或数字,则应使用文本框的Format 属性(而不是在文本框中使用Format 函数)来应用格式设置。

?.NET Framework System.Text.RegularExpressions 中的Regex 函数用于更改现有字符串的格式,例如,设置电话号码格式。下面的表达式使用“替换”函数将字段中的十位电话号码格式从425-555-8080 形式更改为(425) 555-8080 形式:

复制代码

=System.Text.RegularExpressions.Regex.Replace(Fields!Phone.Value,

"(\d{3})[ -.]*(\d{3})[ -.]*(\d{4})", "($1) $2-$3")

转换函数

您可以使用Visual Basic 函数在报表中根据需要转换数据类型。

?您可以使用Visual Basic 函数根据需要转换数据类型。转换函数常用于消除报表中的#Error 消息或设置这类消息的格式。下面的表达式显示为多值参数MySelection 选择的值数目。

复制代码

=CStr(Parameters!MySelection.Count)

决策函数

您可以使用Visual Basic 函数来计算输入值并根据结果返回另一个值。

?Iif 函数可根据表达式的计算结果是否为True 返回两个值中的一个。下面的表达式使用Iif 函数,在LineTotal 的值超过100 时返回布尔值True,否则返回F alse:

复制代码

=Iif(Fields!LineTotal.Value > 100, True, False)

下面的表达式使用多个Iif 函数(也称为“嵌套Iif 函数”),根据PctComplete 的值返回三个值中的一个:复制代码

=Iif(Fields!PctComplete.Value >= .8, "Green", Iif(Fields!PctComplete.Value >= .5, "Amber", "Red"))

?下面的表达式也是根据PctComplete 的值返回三个值中的一个,不过使用的是Switch 函数,该函数返回的是与一系列计算结果为True 的表达式中第一个表达式相关联的值:

复制代码

=Switch(Fields!PctComplete.Value >= .8, "Green", Fields!PctComplete.Value >= .5, "Amber", Fields!PctComplete.Value < .5, "Red")

?下面的表达式测试ImportantDate 字段的值,并在该值早于一周时返回“Red”,否则返回“Blue”。此表达式可用于控制报表项中的文本框的Color 属性。

复制代码

=IIF(DateDiff("d",Fields!ImportantDate.Value, Now())>7,"Red","Blue")

?下面的表达式测试字段PhoneNumber 的值,以了解该值是否为null(在Visual Basic 中为Nothing),并返回“无值”,而不是空值。此表达式可用于控制报表项中的文本框的值。

复制代码

=IIF(Fields!PhoneNumber.Value Is Nothing,"No Value",Fields!PhoneNumber.Value)

?以下表达式测试“部门”字段的值,并返回子报表名称或null(在Visual Basic 中为Nothing)。此表达式可用于条件性钻取子报表。

正则表达式

正则表达式 一、什么是这则表达式 正则表达式(regular expressions)是一种描述字符串集的方法,它是以字符串集中各字符串的共有特征为依据的。正则表达式可以用于搜索、编辑或者是操作文本和数据。它超出了java程序设计语言的标准语法,因此有必要去学习特定的语法来构建正则表达式。一般使用的java.util.regex API所支持的正则表达式语法。 二、测试用具 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Regex{ public static void main(String[]args)throws Exception{ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); if(br==null){ System.out.println("没有输入任何数据"); System.exit(1); } while(true){ System.out.print("输入表达式:"); Pattern pattern=https://www.sodocs.net/doc/1a8229957.html,pile(br.readLine()); System.out.print("输入字符串:"); Matcher matcher=pattern.matcher(br.readLine()); boolean found=false; while(matcher.find()){ System.out.println("找到子字符串"+matcher.group()+" 开始于索引"+matcher.start()+"结束于索引"+matcher.end()+"\n") found=true; } if(!found){ System.out.println("没有找到子字符串\n"); } } } }

If引导条件状语从句的详细用法解答

If引导条件状语从句的详细用法解答 引导条件状语从句最常用的连词是if,常见的if条件状语从句表示在某条件下,某事很可能发生,条件是可能存在的,主句中某种情况发生的概率也是很高的。如: If you ask him,he will help you.如果你请他帮忙,他会帮你的。 If you fail in the exam,you will let him down.如果你考试不及格,你会让他失望的。 If you have finished the homework,you can go home.如果你作业做完了就可以回家了。 另外,if从句还表示不可实现的条件或根本不可能存在的条件,也就是一种虚拟的条件或假设。从句多用一般过去时或过去完成时,表示对现在或过去的一种假设。如: If I were you,I would invite him to the party.如果我是你,我会邀请他参加聚会。 I would have arrived much earlier if I had not been caught in the traffic.要不是交通堵塞,我本会来得早一些。 另外你还要注意if 条件句的时态搭配 1.if从句用一般现在时,主句用一般将来时 If he runs he’ll get there in time. 如果他用跑的,他就会及时赶到那儿。 The cat will scratch you if you pull her tail. 如果你拉猫的尾巴,它就会抓你。2.if从句用一般现在时,主句用may/might/can If the fog gets thicker the plane may/might be diverted. 如果雾在大一些,飞机可能就会改在别的机场降落。 If it stops snowing we can go out. 如果雪停了,我们就可以出去。 3.if从句用一般现在时,主句用must/should If you want to lose weight you must/should eat less bread. 如果你想减肥,你必须少吃面包。 4.if从句用一般现在时,主句用一般现在时 If you heat ice it turns to water. (也可用will turn)如果把冰加热,它就会化成水。5.if从句用现在进行时,主句用一般将来时 If you are looking for Peter you’ll find him upstairs. 如果你是在找彼得,上楼就会找到他。 6.if从句用现在完成时,主句用一般将来时 If you have finished dinner I’ll ask the waiter for the bill. 如果你吃完了,我就叫服务生来算账 注意: 学习" if " 引导的条件状语从句的用法,现在总结一下: if 条件句不一般,几个要点记心间; 条件句,放在前,逗号要放句中间。 条件句表可能,主句多用将来时; 条件句表事实,主句常用现在时。

C#利用正则表达式实现字符串搜索

C#利用正则表达式实现字符串搜索 2005-08-04 22:27 作者:张志远来源:天极网 【简介】 本文给出了在C#下利用正则表达式实现字符串搜索功能的方法,通过对.NET框架下的正则表达式的研究及实例分析,总结了正则表达式的元字符、规则、选项等。 加入收藏设为首页 -------------------------------------------------------------------------------- 3、.NET 框架的正则表达式类 下面通过介绍 .NET 框架的正则表达式类,熟悉一下.NET框架下的正则表达式的使用方法。 3.1 Regex 类表示只读正则表达式 Regex 类包含各种静态方法,允许在不显式实例化其他类的对象的情况下使用其他正则表达式类。以下代码示例创建了 Regex 类的实例并在初始化对象时定义一个简单的正则表达式。请注意,使用了附加的反斜杠作为转义字符,它将 \s 匹配字符类中的反斜杠指定为原义字符。 Regex r; // 声明一个 Regex类的变量 r = new Regex("\\s2000"); // 定义表达式 3.2 Match 类表示正则表达式匹配操作的结果 以下示例使用 Regex 类的 Match 方法返回 Match 类型的对象,以便找到输入字符串中第一个匹配。此示例使用 Match 类的 Match.Success 属性来指示是否已找到匹配。 Regex r = new Regex("abc"); // 定义一个Regex对象实例 Match m = r.Match("123abc456"); // 在字符串中匹配 if (m.Success) {

if条件状语从句练习及答案

if_条件状语从句的时态练习及答案_初中习题集 I.单项选择 1.If you _____ to the party, you’ll have a great time. a. will go b. went c. go d. going 2.It will be a long time ____ peter _____ his work. a. since, has finished b. after, finishes c. when, will finish d. before, finishes. 3. what will father _____ us from Japan? a. take b. bring c. carry d. make 4. Weifang is famous ______ kites a. for b. to c. on d. with 5.I____ her the answer if she ____me. a. can tell, will ask b. will tell, will ask c. would tell, ask d. will tell, asks 6. – what are you going to do tomorrow? --we’ll go to the library tomorrow if it ___. a. isn’t rain b. rain c. won’t rain d. doesn’t rain 7.—Do you know when he will come back tomorrow? --sorry, I don’t know. when he ____ back, I’ll tell you. a. comes b. will come c. come d. may come 8. what will you do if you _____ to the old folk’s home visit? a. go b. went c.going d. will go

Excel中使用正则表达式

Excel另类条件化格式 1 前言 我们知道,Excel的条件化格式可以根据单元个的内容来设置整个单元格的格式。如图1中的C列,当单元格的内容为“结束”时,字体颜色为绿色,为“进行中”时,颜色为黄色。但如果我们想把B列的部分特定文字(如日期2012-3-4)设置成不同的字体和颜色, Excel的条件化格式工具是不能实现的,需要另辟蹊径。 图1 2 实现过程 2.1 目标 实现B列单元格中日期字符串的字体设置成“Arial Black”字体,颜色为红色。 2.2 设计思路 Excel的VBA编程功能很强大,可以轻松实现上述目标。程序的设计思路是:找到日期字符串,然后设置字体格式。本例中利用了正则表达式来寻找日期字符串,通过Characters对象的Font属性来设置字符串的格式。 2.3 正则表达式 我们在处理文本时,经常会遇到一些满足某种规则的字符串。比如,一个无符号的整数由一连串的数字构成,本例中的日期是满足“整数-整数-整数”规则的字符串。正则表达式就是用来指定这种规则的。如果某个字符串满足正则表达式指定的规则,则称该字符串为正则表达式的一个“匹配串”。正则表达式中用\d 来匹配单个数字,用\d+来匹配连续的多个数字,这样本例中用"\d+-\d+-\d+"就可以匹配日期字符串。Excel的VBA可以通过引用vbscript中的正则标定式对象"vbscript.regexp"来使用正则表达式。 2.4 Characters函数 语法:Characters(start, length) 参数:Start是指从第几个字符处开始选择,length是要返回的字符数。 返回:Characters对象。用来控件文本中某一范围的字符串。例如,通过Characters对象的Font属性可以设置字符串的字体格式。 2.5程序代码 把FormatClick程序和“更新”按钮的Click事件关联起来,只要点击“更新”按钮就可以更新日期的字体的名称和颜色了。具体程序如下: Sub FormatClick() '声明正则表达式对象 Dim RegEx As Object '引用正则标定式对象 Set RegEx = CreateObject("vbscript.regexp")

正则表达式语法完整版

正则表达式基础知识 一个正则表达式就是由普通字符(例如字符a 到z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。如:

下面看几个例子: "^The":表示所有以"The"开始的字符串("There","The cat"等); "of despair$":表示所以以"of despair"结尾的字符串; "^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了;"notice":表示任何包含"notice"的字符串。 '*','+'和'?'这三个符号,表示一个或一序列字符重复出现的次数。它们分别表示“没有或更多”,“一次或更多”还有“没有或一次”。下面是几个例子: "ab*":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……);"ab+":表示一个字符串有一个a后面跟着至少一个b或者更多; "ab?":表示一个字符串有一个a后面跟着零个或者一个b; "a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。 也可以使用范围,用大括号括起,用以表示重复次数的范围。 "ab{2}":表示一个字符串有一个a跟着2个b("abb"); "ab{2,}":表示一个字符串有一个a跟着至少2个b; "ab{3,5}":表示一个字符串有一个a跟着3到5个b。

请注意,你必须指定范围的下限(如:"{0,2}"而不是"{,2}")。 还有,你可能注意到了,'*','+'和'?'相当于"{0,}","{1,}"和"{0,1}"。 还有一个'|',表示“或”操作: "hi|hello":表示一个字符串里有"hi"或者"hello"; "(b|cd)ef":表示"bef"或"cdef"; "(a|b)*c":表示一串"a""b"混合的字符串后面跟一个"c"; '.'可以替代任何字符: "a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字; "^.{3}$":表示有任意三个字符的字符串(长度为3个字符); 方括号表示某些字符允许在一个字符串中的某一特定位置出现: "[ab]":表示一个字符串有一个"a"或"b"(相当于"a|b"); "[a-d]":表示一个字符串包含小写的'a'到'd'中的一个(相当于"a|b|c|d"或者"[abcd]");"^[a-zA-Z]":表示一个以字母开头的字符串; "[0-9]%":表示一个百分号前有一位的数字; "[0-9]+":表示一个以上的数字; ",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。 你也可以在方括号里用'^'表示不希望出现的字符,'^'应在方括号里的第一位。(如:"%[^a-zA-Z]%"表 示两个百分号中不应该出现字母)。 为了逐字表达,必须在"^.$()|*+?{\"这些字符前加上转移字符'\'。 请注意在方括号中,不需要转义字符。

VC正则表达式的使用

VC正则表达式的使用 2010年9月11日星期六邵盛松 正则表达式是一种对字符进行模糊匹配的一个公式。在数据有效性验证,查找,替换文本中都可以使用正则表达式。 本篇文章主要描述的是使用ATL中两个模板类CAtlRegExp和CAtlREMatchContext。 在使用CAtlRegExp类之前需要添加#include 这个头文件。 RegExp是Regular Expression的缩写 以匹配邮件地址字符串为例说明两个类的使用 该示例更改自https://www.sodocs.net/doc/1a8229957.html,/en-us/library/k3zs4axe(VS.80).aspx CString strRegex=L"({[0-9_]+@[a-zA-Z0-9]+[.][a-zA-Z0-9]+[.]?[a-zA-Z0-9]+})"; CString strInput; strInput=L"admin@https://www.sodocs.net/doc/1a8229957.html,"; CAtlRegExp reRule; wchar_t *wt = (wchar_t *)(LPCTSTR)strRegex; REParseError status = reRule.Parse((const ATL::CAtlRegExp::RECHAR *)wt); if (REPARSE_ERROR_OK != status) { return 0; } CAtlREMatchContext mcRule; wt = (wchar_t *)(LPCTSTR)strInput; if (!reRule.Match((const ATL::CAtlRegExp::RECHAR *)wt,&mcRule)) { AfxMessageBox(L"您输入的邮件地址不合法!"); } else { for (UINT nGroupIndex = 0; nGroupIndex < mcRule.m_uNumGroups; ++nGroupIndex) { const CAtlREMatchContext<>::RECHAR* szStart = 0;

if条件状语从句中虚拟语气

if条件状语从句中的虚拟语气 一、if条件状语从句中虚拟语气的判断判断是真实条件句还是非真实条件句。 只有在非真实条件句中才使用虚拟语气。通过句子意思,看假设的条件是否能够实现, 能够实现是真实条件句,不能使用虚拟语气; 假设的条件不能实现则是非真实条件句,要用虚拟语气。 1. “后退一步法”后退一步法是指在准确地判断了该句与哪一事实相反后,按虚拟语气的后退一步法处理从句谓语动词的时态。即:在非真实条件状语从句中,谓语动词按正常情况“后退一步”。也就是: ①与过去事实相反,在从句中用过去完成时形式表示。 ②与现在事实相反,在从句中用过去一般时形式表示。 ③与将来事实可能相反,在从句中用过去将来时形式表示。主句中则用情态动词would, should, could 等加一个与从句一致的动词形式。 例:⑴、If I had come her yesterday, I would have seen him. ⑵、If I were a teacher, I would be strict with my students. ⑶、If it should snow tomorrow, they couldn't go out. 2、注意事项: ①if条件句中如有were, should, had,可以省去if,并使用倒装语序。 ②在现代英语中if条件状与从句中的谓语动词如果是be其过去形式一般用were。 二、虚拟语气在if 引导的条件句中的用法: 1. If it weren’t for your help, we would get into trouble. 如果没有你们的帮助,我们就会陷入困境。(而事实上得到了你们的帮助) 2.If the weather were fine, I would go there. 如果天气好,我去那儿。(事实天气不好) 3.If I were you, I would read it again. 如果我是你的话,我再读一遍。(事实上我不是你) 4.If time permitted, I would write it again. 如果时间允许的话,我再写一遍。(事实上时间不允许) 5.If it weren’t snowing, we wouldn’t stay in the house. 要是现在不下雪的话,我们就不会待在屋里。(事实上现在下雪) 6.What would I do if I were in your place?要是我处于你地位我会怎么办?(事实上我不在你的位置上) 7.If he hurried, he could catch the first bus. 他要是快点能够赶上头班公共汽车。(可是他不着急) 8. If I were you, I should buy it. (从句用过去式动词were,主句用动词原形buy) 9. If I had time, I would study French. (如果有时间,我会学习法文。)(从句用过去式动词had,主句用动词原形study) 10. If she knew English, she would not ask me for help. (如果她懂英文,她就不必要我帮了。)(从句用过去式动词knew, 主句用动词原形ask) 注意:如果动作在进行中,主句要用:"主语+ would be + 进行式动词+ ……" 14. If they were here, he would be speaking to them now. (从句用过去式动词were, 主句用would be speaking)

用正则表达式实现排版助手

用正则表达式实现排版助手(GIDOT TYPESETTER)的部分排版功能 2009年08月06日星期四上午 08:42 副标题:用正则表达式实现段首缩进、修正换行、修正非段落换行、删除行尾空格、删除空行 相信使用过排版助手的人应该都觉得这是一个好软件吧?不过,我对其中的“删除非段落换行”有一个不满的地方 [https://www.sodocs.net/doc/1a8229957.html,/gevolution90/blog/item/34cabb7fc2b8710128388ada. html]。于是才引发出这一篇文章。 *如果你还未有在windows下的正则表达式批量替换工具的话,推荐使用TextForever[https://www.sodocs.net/doc/1a8229957.html,/stronghorse/software/index.htm#Tex tForever],很强大的文本整理工具 1.段首缩进: 可以把每行(段)的前面格式化成指定的字符串,比如2个全角空格。 正则:^[ ]*(?=[^\s]) 你可以替换成2个全角空格或4个半角空格或你自己喜欢的任何字符串。 2.修正换行: 有些文章一行紧接着一行,看起来有点不舒服,可以把每段内容段(有文字的段)之间的换行格式化成指定数量的换行比如双换行(两段之间空一行空行)。 正则:[\r\n]+ 你可以替换成2个回车。 3.修正非段落换行: 有点文章很变态的,它从文本内容中实现换行,比如: 第一段的内容,内容,内容 第一段第二行的内容内容内容。 这样的换行,这对于资料的整理有点不利,所以,这个正则就是用来修正这样的换行的,把它们合并成一行,即一个段落。 正则:^(。{25,}[^……“”!!::??])\r\n 替换成:$1 把你认为不是段落结束的标点加入到那个中括号中,大括号中的“25”为作

js正则表达式使用

js正则表达式使用 一,概述 1,正则表达式,可以说是任何一种编程语言都提供的机制,它主要是提供了对字符串的处理能力。 2,正则表达式在页面处理中的使用场景: 1)表单验证。验证某些域符合某种规则,例如邮件输入框必须输入的是邮件、联系电话输入框输入的必须是数字等等 2)处理DOM模型。例如通过表达式定位DOM中的一个对象或一系列对象,一个例子就是定位id属性中含有某个特殊字符的div对象。 3)纯编程逻辑。直接用于编程的逻辑之中。 3,说明:本部分所举的正则表达式的代码片断,都是经过测试的,但有一点需要注意,对于换行的字符串的定义,我们在表述时使用的是类似如下的形式: var str=“It?s is a beautiful city”; 这种形式直接写在JS代码中是错误的,那如何获取具有换行的字符串呢?简单的办法:在textarea中输入文本并换行,然后将该值赋给JS变量即可。例如: var str=document.forms[0].mytextarea.value; 二,语法与使用 1,定义正则表达式 1)定义正则表达式有两种形式,一种是普通方式,一种是构造函数方式。 2)普通方式:var reg=/表达式/附加参数 表达式:一个字符串,代表了某种规则,其中可以使用某些特殊字符,来代表特殊的规则,后面会详细说明。 附加参数:用来扩展表达式的含义,目前主要有三个参数: g:代表可以进行全局匹配。 i:代表不区分大小写匹配。 m:代表可以进行多行匹配。 上面三个参数,可以任意组合,代表复合含义,当然也可以不加参数。 例子: var reg=/a*b/; var reg=/abc+f/g; 3)构造函数方式:var reg=new RegExp(“表达式”,”附加参数”); 其中“表达式”与“附加参数”的含义与上面那种定义方式中的含义相同。 例子: var reg=new RegExp(“a*b”); var reg=new RegExp(“abc+f”,”g”); 4)普通方式与构造函数方式的区别 普通方式中的表达式必须是一个常量字符串,而构造函数中的表达式可以是常量字符串,也可以是一个js变量,例如根据用户的输入来作为表达式参数等等: var reg=new RegExp(document.forms[0].exprfiled.value,”g”);

正则表达式在垂直搜索引擎中的应用

作者简介:张斌(1977-),硕士,讲师,研究方向:电子商务专业方向。 收稿日期:2010-05-06 正则表达式在垂直搜索引擎中的应用 张斌 (浙江越秀外国语学院,绍兴312000) 摘要:采用聚焦爬虫可以提高搜索引擎的检索效率,聚焦爬虫经常使用正则表达式来进行有效的信息检索,着重分析了网页检索中常用的正则表达式,为搜索引擎的构建提供帮助。关键词:正则表达式;聚焦爬虫;信息检索中图分类号:TP3 文献标识码:B 文章编码:1672-6251(2010)08-0162-02 Application of Regular Expressions in Vertical Search Engine ZHANG Bin (Zhejiang Yuexiu Foreign Language College,Shaoxing 312000) Abstract:Because focused crawler system can promote the efficiency of search engine and regular expression could used to get quick and efficient search.In this paper,regular expression used in web page index was analyzed for providing useful help for researcher in vertical search engine. Key words:regular expressions;focuses crawler;information retrieval 页面内容提取、分词、自然语言处理是聚焦爬虫的主要工作。在内容提取中采用正则表达可以明显提高效能,已在许多搜索程序中广泛应用。以下列举几个常用的正则表达,并分析其在聚焦爬虫中的应用方法,以供同行参考。 1正则表达式与文档内容提取 正则表达式是一种编程语言中使用的特殊代码模 式,可用其验证、查找、替换与划分文本内容。聚焦爬虫往往通过对主题网页的学习提取主题特征的正则表达式,以指导爬虫过滤与主题不相符的网页文本[4]。正则表达式基本技巧如下: (1)匹配多个字符之一。如匹配拼写错误的fac - tory ,可用:f [ae]ct [ou]ry ; (2)匹配文本行开始与结束。如以c 开始,a 结束,可用:^a.*b$; (3)匹配单词。如找dog ,可用:\bdog\b ; (4)Unicode 字母。如匹配中文,可用:[\u3400- \u4DB5\u4E00-\u9fa5]; (5)分组和捕获。如匹配年月日相同的日期,可用:\b\d\d (\d\d)-\1-\1\b ,其中1表示捕获分组1,即 (\d\d)中的内容,捕获分组可以表示临时存取的区域, 用于引用和替换; (6)重复匹配。完整HTML 文件可用: .*?.*?.*?.*.*?]*>.*>.*?. 其中:*表示一个或多个,?表示0个或一个,^表示否定。 Html 文件也可使用NekoHTML 做标签补偿,用HtmlParser 等解析程序将网页转换成一个个串联的Node ,用正则式过滤脚本、注释等标签,提取表格等结构化信息,实现网页去噪。其中包括为网页建立网站风格树和计算节点重要性来确定噪声元素。 2正则表达式编程 使用C#、Java 等编程语言的步骤如下:①要先要 导入函数库,其中C#用using System.Text.RegularEx - pressions ;Java 用import java.util.regex.*;②创建正则表达式对象,C#用Regex regexObj =new Regex (" regex pattern");Java 用Pattern regex=https://www.sodocs.net/doc/1a8229957.html,pile ("regex pattern");Matcher regexMatcher =regex.matcher (subjectString);③在网页信息提取中,拆分字符串、逐行查找为常用功能,C#代码如下:string []spli - tArray=Regex.Split (subjectString,"<[^<>]*>>"),其中

PHP 常用正则表达式 正则

PHP 常用正则表达式正则 平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用:"^\d+$"//非负整数(正整数+ 0) "^[0-9]*[1-9][0-9]*$"//正整数 "^((-\d+)|(0+))$"//非正整数(负整数+ 0) "^-[0-9]*[1-9][0-9]*$"//负整数 "^-?\d+$"//整数 "^\d+(\.\d+)?$"//非负浮点数(正浮点数+ 0) "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"//正浮点数"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"//非正浮点数(负浮点数+ 0) "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"//负浮点数 "^(-?\d+)(\.\d+)?$"//浮点数 "^[A-Za-z]+$"//由26个英文字母组成的字符串 "^[A-Z]+$"//由26个英文字母的大写组成的字符串 "^[a-z]+$"//由26个英文字母的小写组成的字符串 "^[A-Za-z0-9]+$"//由数字和26个英文字母组成的字符串 "^\w+$"//由数字、26个英文字母或者下划线组成的字符串 "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"//email地址 "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"//url /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日 /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年 "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil /^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/ //电话号码 "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}| 1dd|2[0-4]d|25[0-5])$" //IP地址 匹配中文字符的正则表达式:[\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内):[^\x00-\xff] 匹配空行的正则表达式:\n[\s| ]*\r 匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 匹配首尾空格的正则表达式:(^\s*)|(\s*$) 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$ 元字符及其在正则表达式上下文中的行为: \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转

if引导的条件状语从句知识点及练习题

if引导的条件状语从句 (一)定义 if引导的句子在复合句中表示条件,假如if从句的动作发生,主句的动作就(不)会发生,因此称为条件状语从句。 (二)位置 if 引导的条件状语从句位置灵活,可直接放在主句后面,也可以放在句首。放在句首时,从句后面要用逗号和主句隔开。 ① If I have enough money, I will travel around the world. ② I will travel around the world if I have enough money. (三)用法 ① Work hard, and you?ll pass the exam easily. 努力学习,你将很容易通过考试。 →If you work hard, you?ll pass the exam easily. ② Hurry up, or you?ll miss the train. 快点儿,否则你就赶不上火车了。 →If you don?t hurry up, you?ll miss the train. (3)当主句含有情态动词时,if引导的条件状语从句通常用一般现在时。 We must study hard if we want to pass the final exam. 如果想通过期末考试,我们必须努力学习。 (4)用含介词with或without的介词短语转换。 ① If you help me, I'll finish my job soon. →With your help, I'll finish my job soon. 如果你帮我,我将很快完成我的工作。 ② If there is no water, fish can?t live. → Fish can?t l ive without water. 离开水,鱼不能生存。 (四)if引导的条件状语从句与if引导的宾语从句的区别 if引导宾语从句时表示“是否”,位于及物动词之后; if引导的条件状语从句时表示“假如,如果”,位于句首或句中。 ①I don't know if he will come tomorrow. ②If he comes, I'll call you. 练习 一、选择题 1. _____ you don't go to bed earlier, you will feel tired in the morning. A. Unless B. If C. Though D. Until 2. Why not look up the new word in a dictionary _____ you don't know it? A. if B. that C. though D. whether 3. Talk to your teacher and you will get help _____ you have a problem. A. unless B. if. C. until D. so 4. I won't go to tomorrow's party _____ I'm invited. A. if B. unless C. when 5. The children will climb the hill if it _____ tomorrow.

正则表达式

要想真正的用好正则表达式,正确的理解元字符是最重要的事情。下表列出了所有的元字符和对它们的一个简短的描述。 字符描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配字符“n”。“\\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。 ^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。 * 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,“z o+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“d o”。?等价于{0,1}。 {n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。 {n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“fo o o ood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。 {n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。 ? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o?”将匹配单个“o”,而“o+”将匹配所有“o”。 点匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“[\s\S]”的模式。

正则表达式及小例子

字符串处理是许多程序中非常重要的一部分,它们可以用于文本显示,数据表示,查找键和很多目的.在Unix下,用户可以使用正则表达式的强健功能实现 这些目的,从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础工具,可以用于很多类型的文本处理,如匹配,搜索,提取 和分析结构化内容. java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher. Pattern是一个正则表达式经编译后的表现模式。在java中,通过适当命名的Pattern类可以容易确定String是否匹配某种模式.模式可以象匹配某个特 定的String那样简单,也可以很复杂,需要采用分组和字符类,如空白,数字,字母或控制符.因为Java字符串基于统一字符编码(Unicode),正则表达式也 适用于国际化的应用程序. Pattern类的方法简述 方法说明 static Pettern compile(String regex,int flag)编译模式,参数regex表示输入的正则表达式,flag表示模式类型(Pattern.CASE_INSENSITIVE表示 不区分大小写) Matcher match(CharSequence input)获取匹配器,input时输入的待处理的字符串 static boolean matches(String regex,CharSequence input)快速的匹配调用,直接根据输入的模式regex匹配input String[]split(CharSequence input,int limit)分隔字符串input,limit参数可以限制分隔的次数 Matcher一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。首先一个Pattern实例订制了一个所用语法与 PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。 Matcher类的方法简述 方法说明 boolean matches()对整个输入字符串进行模式匹配. boolean lookingAt()从输入字符串的开始处进行模式匹配 boolean find(int start)从start处开始匹配模式 int groupCount()返回匹配后的分组数目 String replaceAll(String replacement)用给定的replacement全部替代匹配

正则表达式

正则表达式
目录
1. 引言 2. 基本语法 3. sed 4. awk 5. 练习:在 C 语言中使用正则表达式
1. 引言
以前我们用 grep 在一个文件中找出包含某些字符串的行,比如在头文件中找出一个宏定义. 其实 grep 还可以找出符合某个模式(Pattern)的一类字符串.例如找出所有符合 xxxxx@xxxx.xxx 模式的字符串(也就是 email 地址),要求 x 字符可以是字母,数字,下划 线,小数点或减号,email 地址的每一部分可以有一个或多个 x 字符,例如 abc.d@https://www.sodocs.net/doc/1a8229957.html,, 1_2@987-6.54,当然符合这个模式的不全是合法的 email 地址,但至少可以做一次初步筛选, 筛掉 a.b,c@d 等肯定不是 email 地址的字符串.再比如,找出所有符合 yyy.yyy.yyy.yyy 模 式的字符串(也就是 IP 地址),要求 y 是 0-9 的数字,IP 地址的每一部分可以有 1-3 个 y 字 符. 如果要用 grep 查找一个模式,如何表示这个模式,这一类字符串,而不是一个特定的字符串 呢?从这两个简单的例子可以看出,要表示一个模式至少应该包含以下信息: 字符类(Character Class):如上例的 x 和 y,它们在模式中表示一个字符,但是取 值范围是一类字符中的任意一个. 数量限定符(Quantifier): 邮件地址的每一部分可以有一个或多个 x 字符,IP 地址 的每一部分可以有 1-3 个 y 字符 各种字符类以及普通字符之间的位置关系:例如邮件地址分三部分,用普通字符@和. 隔开,IP 地址分四部分,用.隔开,每一部分都可以用字符类和数量限定符描述.为 了表示位置关系,还有位置限定符(Anchor)的概念,将在下面介绍.
规定一些特殊语法表示字符类,数量限定符和位置关系,然后用这些特殊语法和普通字符一 起表示一个模式,这就是正则表达式(Regular Expression).例如 email 地址的正则表达式 可以写成[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9_.-]+,IP 地址的正则表达式可以 写成[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.下一节介绍正则表达式的语法, 我们先看看正则表达式在 grep 中怎么用.例如有这样一个文本文件 testfile:
192.168.1.1
第 1 页 共 10 页

相关主题