Expresso使用说明

3倍性能!Dynamic Expresso vs Roslyn:C#动态执行的终极对决! 摘要:Dynamic Expresso作为C#动态执行的高效方案,解决了传统方法(如Roslyn)的性能、安全和调试难题。实测显示,其表达式解析速度比Roslyn快3倍,且通过变量作用域隔离提升安全性。支持数学运算、对象属性访问等语法,兼容.NET Core/Framework。实战案例证明,Dynamic Expresso在规则引擎、实时计算等场景优势显著,尤其适合轻量级高频调用。开发者可通过NuGet快速集成,结合缓存与安全设计,实现高效动态代码执行。(149字) 阅读详情

Expresso使用说明

 

 

修订历史记录

日期

版本

说明

作者

2005-07-04

1.0

初建

唐家平

 

 

 

 

 

 

 

 

 

 

 

1     简介... 2

2     引入框架开发的目的... 2

3     安装与配置    2

3.1             有两种安装方法    2

3.2             配置expresso-config.xml 2

3.3             国际/本地化问题    3

4     Expresso功能列表... 3

5     最佳实践... 3

5.1             创建包    3

5.2             创建一个Schema对象    4

5.3             创建一些需要的数据(DB)对象    4

5.4             创建一些需要的控制器(Controller)对象    5

5.5             创建一些需要的工作任务(Job)对象    10

5.6             安装Expresso应用    10

5.6.1        在config目录里创建XML配置文件    10

5.6.2        注册Schema和创建/初始化数据库    10

6     Expresso专题    11

6.1             数据对象    11

6.2             控制器对象    11

6.3             初始化Expresso为Java Application环境    12

6.4             DBTool和DBCreate. 12

6.5             数据库连接池    12

7     使用Expresso框架后工作划分... 12

7.1             分析和设计人员(包括数据库设计)    12

7.2             美工、界面设计人员    12

7.3             程序员    12

8     Expresso和Spring+Hiberate组合结构的比较    13

9     开发Expresso建议... 13

10          参考资料    14

 


1         简介

Expresso是jcorporate提供的一Java开源项目,项目组主要的收入来源是出售该项目的服务支持(目前每年的服务支持费是$999.00US)。

Expresso基于Struts,也就是说Struts是它的核心思想。

随Expresso的安装包里,expresso/doc提供了完整的文档。最新版本的软件包可以从如下网址获得:

http://www.jcorporate.com

 

 

2         引入框架开发的目的

总结起来,目的大概如下三条:

1.      规范化开发结构;

2.      提供大多数项目均需要的服务功能,如日志、持久层管理等;

3.      提供开发工具和方法,以加快开发速度。

没有结构不成方圆,程序设计从最初的机器语言发展为结构化的高级语言,从面向过程发展为面向对象,其内在原因就是由于开发的规模在急剧扩大。我们可以采用各种方法实现我们的软件项目,可是没有组织好的上千万行代码将带来的结果是可读性极低、可扩展性极差。“项目的开发象一头巨兽陷在泥潭,越陷越深。”

软件需求变幻无穷,计划没有变化快,但是我们还是要寻找出不变的东西,并将它和变化的东西分离开来,框架就是这一思想的成果。

 

3         安装与配置

3.1       有两种安装方法

解压下载来的expresso5.0.5.zip或expresso5-0-5-src.zip或expresso5.0.5.war均能得到一个Expresso的应用,也就是开发环境;

解压下载来的expresso5-0-5-complete.zip将得到一个带有Tomcat服务的完全版本。

启动服务后,测试URL:http://localhost:8080/expresso/frame.jsp。

 

3.2       配置expresso-config.xml

Expresso的主要配置信息文件,它在服务启动时被ConfigManager对象读入,应用里的任何对象均可通过ConfigManager对象对之进行操作。ConfigManager是一个单一实例模式的对象,甚至在配置了几个数据上下文(连接池)项目。

信息包括:将日志写在哪个目录;"class-handlers"部分指明Expresso和应用使用的变量和所实现的类的对应关系,即相对于程序设计里的变量申明;"context"部分通常是数据库的配置。

一旦expresso-config.xml被读入,安装信息便从每个对应数据库中读入,每个连接池也就初始化好了。

数据库的使用通常是:保持使用“Default”为Expresso自带的数据库,另外增加一数据库上下文配置为用户提供数据存放,通过登陆时切换数据库。在配置文件里使用<hasSetupTables>false</hasSetupTables>进行区分。

 

登陆切换数据库Html语句如下:

<input type="HIDDEN" name="dbContext" value="default" >

 

3.3       国际/本地化问题

本地化(中文)问题与MessagesBundle_*.properties文件有关,可用修改MessagesBundle_zh.properties文件使Expresso的界面中文化。可以使用native2ascii命令完成编码转换。

项目界面的中文化问题建议采用重新编写自己项目View部分的jsp,并通过编写继承的Controller或重定义Action实现。这样,就避免破坏原Expresso结构。也就是说,借用Expresso功能时,我们不借用“界面”部分,当然,该部分对界面的开发有着很高的借鉴意义。

 

4         Expresso功能列表

1.      提供应用的组织和配置;

2.      提供数据库访问和数据对象工具包;

3.      支持MVC结构和创建几种类型的Controller对象的组件包;

4.      提供任务队列操作;

5.      提供容易快速创建Servlet和JSP的方法;

6.      提供定义那些发生在Web应用之间的事件机制;

7.      提供一定数量的其他有用的功能;

 

8.      日志功能;

9.      用户安全功能;

10.  初始化机制;

11.  数据库数据缓冲管理;

 

5         最佳实践

一个典型的Web应用通常是由一组数据(Database)对象(包括Model和持久化数据库),控制(Controller)对象、工作任务(Job)对象和一个单一的计划(Schema)对象将它们紧紧地联系在一起。在这种情况下,应用可以使用一个普通的“View handler”进行测试。以下的提供的源码是一个股票买卖的例子,Orange Trader,2002年4月由Peter Pilgrim编写。

 

5.1       创建包

通常需要创建如下包:

²       dbobj: 包含数据库对象;

²       controller: 包含控制器对象;

²       job: 包含工作任务对象,可选;

 

5.2       创建一个Schema对象

Schema:a Web Application Context object

创建一个Schema对象,放在包的根;Schemo对象为Expresso提供全部的引用,用以安全管理等(注册后),这是设计模式的FACADE模式思想。

 

必需做的工作:

1.        加入所有的和应用相关的controllers, dbobjects or jobs;

2.        设置MessageBundle路径,getMessageBundlePath()返回国际化项目资源所在路径;

 

最容易的方法是拷贝一个现成的Schema类进行修改,如:

<OrangeTraderSchema.java>

import com.jcorporate.expresso.core.db.*;

import com.jcorporate.expresso.core.dbobj.Schema;

public class OrangeTraderSchema extends Schema

{

    public OrangeTraderSchema()       throws DBException

    {

       super();

       try {

           addDBObject( "com.xenonsoft.orangetrader.ot1.dbobj.StockTrade"  );

           addController( "com.xenonsoft.orangetrader.ot1.controller.StockController" );

       }

       catch ( Throwable t ) {

           throw new DBException( t.getMessage() );

       }

    }

 

    public String getMessageBundlePath() {

       return "com/xenonsoft/orangetrader";

    }

}

 

 

5.3       创建一些需要的数据(DB)对象

通常情况下,所有数据对象类均放在dbobj包里,并使用Schema类注册这些数据对象,以便DBTool和DBCreate能够使用它们。

数据对象是为Expresso的持久层而设计的,相当于EJB里的Entity JavaBean(若使用EJB,可对应移植),是表在关系数据库里的直接映射。使用数据对象的优势在于:缓冲机制、值校验、引用完整性和数据安全;可以避免编写SQL语句,而这些SQL语句由于不同的数据库系统有不同的版本;数据对象和业务逻辑是相关的,通过引用完整性和复杂的表间关系可以达到和存储过程一样的效果。这样就实现了“与数据库无关”。

创建的方法有很多,一个DBObject里必需的实现constructors、setupFields、getThisDBObj()方法。

 

< StockTrade.java >

import com.jcorporate.expresso.core.dbobj.*;

import com.jcorporate.expresso.core.db.*;

 

public class StockTrade extends SecuredDBObject

{

public StockTrade()        throws DBException

    {        super();  }

 

public StockTrade(DBConnection theConnection) throws DBException

    {        super(theConnection); }

 

protected synchronized void setupFields()

       throws DBException

{

       setTargetTable("STOCKTRADE");

       setDescription("Stock Trade I");

       addField("ST_ID", "int",       0, false, "Text Channel Autoincrement ID");

       addField("ST_TITLE",       "varchar",  40, false, "Stock Title");

       addField("ST_TRADER",       "varchar",  40, false, "Owner Trader");

       addField("ST_STATUS",       "varchar",  10, true,  "Trade Status" );

       addField("ST_PRICE",       "float",     0, true,  "Current Price" );

       addField("ST_ASK",       "float",     0, true,  "Asking Price" );

       addField("ST_BID",       "float",     0, true,  "Bid Price" );

       addField("ST_CHANGE",       "float",     0, true,  "Percentage Change" );

 

       addKey("ST_ID");

}

 

public DBObject getThisDBObj() throws DBException {

       return new StockTrade();

}

}

 

5.4       创建一些需要的控制器(Controller)对象

一个控制器就是应用从当前状态转换成下一状态的访问点。这就是Finite State Machine的思想。最典型的例子就是ATM自动取款机,和你交互的取款机就是一个控制器,每一次交互就对应控制器的一个功能单元(State)。

控制器对象类通常放在Controller包里。

控制器对象封装了应用的大部分业务逻辑(数据对象也有业务逻辑),象征着整个应用的业务层。你可以单独地去设计你的表示层,充分考虑输入和输出。

控制器中有着“run+状态名(首字母大写)+State”的方法会在调用相应状态名时被自动调用,该方法还应该申明为void和private或protected。

 

Controller和View的接口:

Controller的输入:

命令行参数;From_bean方式

Controller的输出:

通常采用Block对象集合传递参数,Block又可包含Input、Output、Action对象。

 

< StockController.java >

import java.util.*

import com.jcorporate.expresso.core.controller.*;

import com.jcorporate.expresso.core.controller.session.*;

import com.jcorporate.expresso.core.dbobj.*;

import com.jcorporate.expresso.core.db.*;

import com.xenonsoft.orangetrader.ot1.dbobj.StockTrade;

 

public class StockController extends DBController

{

public StockController()

{

       super();

 

       addState( new State("displayStocks", "displayStocks"));

       addState( new State("promptBuyStock", "Prompt Buy Stock"));

       addState( new State("promptSellStock", "Prompt Sell Stock"));

       addState( new State("buyStock", "Buy Stock"));

       addState( new State("sellStock", "Sell Stock"));

   setInitialState("displayStocks");   //一定别忘了

}

 

public String getTitle() {

return "Stock Controller II";

}

 

protected ControllerResponse runDisplayStocksState(

      ControllerRequest myRequest, ControllerResponse myResponse )

      throws ControllerException

{

  String myName=thisClass+"displayStocks() ";

  System.out.println( myName );

 

  try {

     

      // Create a block called "StockList" which is the root of the controller

      // response.

      Block blockList = new Block("StockList" );

 

      // We retrieve all the stocks from the database. For each row

      // tuple form the database we create an Output for it.

      StockTrade stockInit = new StockTrade();

      stockInit.setDBName( myRequest.getDBName() );

      ArrayList list = stockInit.searchAndRetrieveList( "ST_TITLE" );

      int N=list.size();

      for ( int k=0; k<N; ++k ) {

    StockTrade stock = (StockTrade)list.get(k);

     

    // Create a Block for each row tuple

    Block blockRow = new Block("Stock"+k );

    blockList.add( blockRow );

      

    // Create an Output for the DBObject row tuple and add to

    // the row Block

    Output out1 = new Output();

    out1.setName( "Detail" );

    out1.setAttribute( "Title",  stock.getField("ST_TITLE") );

    out1.setAttribute( "Trader", stock.getField("ST_TRADER") );

    out1.setAttribute( "Price",  stock.getField("ST_PRICE") );

    out1.setAttribute( "Ask",    stock.getField("ST_ASK") );

    out1.setAttribute( "Bid",    stock.getField("ST_BID") );

    out1.setAttribute( "Change", stock.getField("ST_CHANGE") );

    out1.setAttribute( "Status", stock.getField("ST_STATUS") );

    blockRow.add( out1 );

    // out1.setAttribute( "", stock.getField("ST_") );

 

    // Add a "buy" transition

    // NOTE: this state requires a request parameter "buyPage"

    // to specifies the JSP of the prompt buy view

    Transition buyTransition = new Transition("Buy", getClass().getName() );

    buyTransition.setName( "Buy" );

    buyTransition.addParam("state", "promptBuyStock");

    buyTransition.addParam("stock", stock.getField("ST_ID") );

    blockRow.add(buyTransition);

     

    // Add a "sell" transition

    // NOTE: this state requires a request parameter "sellURL"

    // to specifies the JSP of the prompt sell view

    Transition sellTransition = new Transition("Sell", getClass().getName() );

    sellTransition.setName( "Sell" );

    sellTransition.addParam("state", "promptSellStock");

    sellTransition.addParam("stock", stock.getField("ST_ID") );

    blockRow.add(sellTransition);

     

      }

     

      // Finally add the block to the list

      myResponse.addBlock( blockList );

 

  }

  catch (DBException dbe) {

      throw new ControllerException(

    myName+ " database exception: "+dbe.getMessage() );

  }

 

  myResponse.setStyle("displayStocks" );

 

  return myResponse;

}

//……More code

}

 

构造器里不能少的是调用父类方法super()和setInitialState();而super.newState(newState)则是应用安全规则所必需的。

 

以下为显示页面

< orangetrader/ot2 /index.jsp>

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" %>

<%@ taglib uri="/xenon" prefix="xenon" %>

<%@ taglib uri="/xspresso" prefix="xspresso" %>

 

<%@ page import="com.xenonsoft.orangetrader.ot1.dbobj.StockTrade" %>

<%@ page import="com.xenonsoft.orangetrader.ot1.controller.StockController" %>

 

<table width="100%" border="1" cellspacing="1" cellpadding="2" >

    <tr>

        <th> <b>Title</b> </th>

        <th> <b>Trader</b> </th>

        <th> <b>Price</b> </th>

        <th> <b>Ask</b> </th>

        <th> <b>Bid</b> </th>

        <th> <b>Change</b> </th>

        <th> <b>Status</b> </th>

        <th colspan="2"> <b>Command</b> </th>

    </tr>

 

<xspresso:block blockPath="StockList" id="blockStocks" >

 

  <xenon:loop name="blockStocks" property="nested"

       loopId="block" className="com.jcorporate.expresso.core.controller.Block"

       counterId="counter" >

 

    <tr bgcolor="<%= ( counter.intValue() % 2 == 0 ? "#F0F0F0" : "#E0E0E0" ) %>" >

  <xspresso:output outputPath="Detail" blockName="block" >

    <td> <xspresso:outputAttribute property="Title" /> &nbsp; </td>

    <td> <xspresso:outputAttribute property="Trader" /> &nbsp; </td>

    <td> <xspresso:outputAttribute property="Price" /> &nbsp; </td>

    <td> <xspresso:outputAttribute property="Ask" /> &nbsp; </td>

    <td> <xspresso:outputAttribute property="Bid" /> &nbsp; </td>

    <td> <xspresso:outputAttribute property="Change" /> &nbsp; </td>

    <td> <xspresso:outputAttribute property="Status" /> &nbsp; </td>

  </xspresso:output>

 

  <form action="<%= contextPath %>/StockController2.do?cmd=button" method="POST" >

    <td>

      <xspresso:transition transitionName="Buy" blockName="block"

        htmlClass="orange-form-submit-orange" />

    </td>

    <td>

      <xspresso:transition transitionName="Sell" blockName="block"

        htmlClass="orange-form-submit-orange" />

    </td>

  </form>

    </tr>

  </xenon:loop>

</xspresso:block>

</table>

 

5.5       创建一些需要的工作任务(Job)对象

Job对象通常被用在那些不需要用户交互而独立运行的任务,或者是把一耗时长的任务封装到一个线程里处理。Job对象和用户间通常采用消息通讯。

Job对象通常放在job包里。

每一Job对象均对应一个JobHandler线程,JobHandler线程能被配置成在连接数据库后自动执行。

(本例不涉及Job对象)

5.6       安装Expresso应用

5.6.1    在config目录里创建XML配置文件

struts-config.xml

该文件是Expresso框架在Struts组件里自身的URL's到"Action"对象的映射关系,一般情况下,用户不必调整此文件。用户的Struts对应关系由用户编写XXX-config.xml完成(XXX表示应用的名字),具有这样命名格式的配置文件在struts-config.xml被读取时一同被读取,编写方法可借鉴struts-config.xml,更多内容请阅读Struts文档。

以下为orange-struts-config.xml文件部分内容:

    <action path="/StockController2" type="com.xenonsoft.orangetrader.ot2.controller.StockController" scope="request" validate="false">

       <forward name="displayStocks"       path="/orangetrader/ot2/index.jsp" />

       <forward name="promptBuy"       path="/orangetrader/ot2/buy.jsp" />

       <forward name="promptSell"       path="/orangetrader/ot2/sell.jsp" />

    </action>

其实质表示:

1.      动作的输入为/StockController2.do?state= displayStocks;

2.      在执行/orangetrader/ot2/index.jsp之前插入了StockController的一段代码,相当于传统的Jsp头部的嵌入式脚本;

3.      StockController和Jsp之间的数据采用Block对象传递;

4.      在页面中的服务器脚本交由标签处理。

 

expressoLogging.xml

定义Expresso使用Log4j各对象产生日志的等级,用户应用使用Log4j各对象产生的日志等级由XXX Logging.xml定义,XXX表示应用的名字。

expressoLogging.xml文件由LogManager进行读入管理,ConfigManager是第一个调用LogManager的对象。

 

5.6.2    注册Schema和创建/初始化数据库

启动Expresso的Tomcat服务程序,使用浏览器打开Expresso主页:http://localhost:8080/expresso/frame.jsp,使用Admin登陆,选择“Applications”页,使用Component Manager去添加注册Schema。

上例如下设置:

    Schema Class File:       com.xenonsoft.orangetrader.OrangeTraderSchema

    Schema Description:       OrangeTrader Demo

Component Code:       orangetrader

 

在Setup也,使用Create/Verify Database Structure & Perform Initial Setup来创建数据库表。

 

使用浏览器输入URL:http://localhost:8080/应用目录/ 就可以开始你的应用了。

 

6         Expresso专题

6.1       数据对象

继承自SecuredDBObject类的数据对象无需加入任何代码便有了安全属性,也就是说,可以用此来控制某个用户是否可用该数据对象。

 

在SetupFields里可以使用:

使用setDBName(String)方法可以指定数据库;

addDetail方法可以实现表间Master/Detail关系,并应用主从表规则如自动删除、键置更新等;

还可以通过setLookupObject方法实现一个数据对象对应多个表的情况。

 

通过Schema注册数据对象的不同方法,可以将表映射到不同机器的数据库中。

 

6.2       控制器对象

Controller和DBController的不同就象DBObject之于SecuredDBObject,均是安全性的不同。一个控制器可类似地对应一个use case,每个State便是use case的细节用例。

控制器能被各种各样的客户端程序调用: Servlet,JSP,Applet和Application。

控制器是居留内存的,不安全线程代码是一个可怕恶梦,请注意使用synchronized(针对静态数据成员)或Hashtable来处理线程安全性问题。

控制器活动图:

状态:椭圆表示;

输出:带名字的箭头表示;

每个控制器状态都是安全线程模式的,也就是说:不可能指望在状态间共享内存变量。

你可用通过在expresso-config.xml插入如下行而修改成自己的登陆界面(而不是通过修改Expresso自带的Jsp文件):

<class-handler name="login"

classHandler="com.jcorporate.myproject.controller.MyLoginController"/>

 

 

6.3       初始化Expresso为Java Application环境

让Expresso不是Web Application方式执行也是可能的,如下就是一个例子:com.jcorporate.expresso.core.utility.JobHandler,这时Struts将不能使用,但是ConfigManager、CacheManager、DB connection pools和logging等仍能使用。

 

6.4       DBTool和DBCreate

DBTool是一个脱离Web环境的Java Application,DBCreate/DBTool可以通过用户定义的DBObject在数据库里创建表,也可以反过来,从数据表产生Java bean(DBObject)。

 

6.5       数据库连接池

支持多连接池,可同时提供多个分布在不同机器、不同类型的数据库连接池,也就是说,可以实现例如将Sybase的数据导入Oracle数据库的功能。

 

 

7         使用Expresso框架后工作划分

7.1       分析和设计人员(包括数据库设计)

²       系统分析

²       需求分析

²       软件设计

1.        控制器和视图之间的数据交换接口

2.        MVC设计图

3.        由控制器延伸业务相关类图

4.        由控制器延伸业务相关序列图

5.        数据字典

6.        表间关系、触发器和存储过程

 

7.        不再需要Web Application的结构设计

 

7.2       美工、界面设计人员

²       熟悉标签库

²       输入界面

²       输出界面

 

7.3       程序员

²       编写控制器对象

²       延伸出来的业务相关Java Bean

²       数据对象(按照数据库设计人员的数据字典编写表的创建脚本代码)

 

 

8         Expresso和Spring+Hiberate组合结构的比较

1.      Expresso最大的亮点就是引入了作为业界MVC标准的Struts,并以之为核心思想,实现了一个表示层-业务层-持久层的应用框架。

2.      Expresso没有使用第三方持久层组件,持久层和连接池为自主开发,效率值得考证。事实上,持久层的强大功能也是Expresso的一大亮点,她将“与数据库无关”理论实现得相当完美。

3.      Expresso整个系统所引入的东西较多(多于200个文件),包括很多JSP、Java Bean、配置XML、数据库表等,造成本身的结构都很复杂,给学习者带来较大的困难,且怎么取舍那么多界面元素的.jsp还是个问题。

4.      Expresso本身就是一个Web应用,不象许多第三方组件商,仅提供.jar包,因此使用该框架进行开发,就使用方法方面带来了差异。与其说是使用Expresso工具为我们的项目应用服务,还不如说是扩展开发Expresso。Expresso带来的是一些现成的工具,同时带来了一种开发模式。开发模式和开发方式比较固定,自由度较低,层级功能是很难单个拆分的,如去掉Expresso的用户安全系统可能就比较难了。

5.      Spring等其他框架,使用时更象是使用一种第三方工具,使用过程通过实例创建和方法调用完成。由于使用时就只引入几个有限的Jar文件,感觉起来封装性较好,使用时更自由,当然也就没有安全模块这样的公共模块了。

6.      Spring、iBatis等其他第三方组件,通常直接采用HashMap对象传递数据,Expresso里则采用Block对象。

 

 

9         开发Expresso建议

为保持Expresso的完整性,请遵守不要修改系统所带来的*.jsp、*.java文件,配置文件xml内容尽量只增加不修改的原则。

项目的目录结构视Expresso为一个组件,尽量不要将项目的目录放入Expresso目录结构中,以免查找困难。

project

   |

   +-- src - 源文件

   |

   +-- lib – 包文件

   |

   +-- docs – 文档

   |

   +-- build -编译后的发布结构

   |

   +-- web--expresso - Expresso的jsps

        |

        +---WEB-INF  - 发布的lib、Classes,包含Expresso的

        |

        +---project jsps - 项目的jsp,按模块分

 

10    参考资料

Expresso Developer's Guide

Best Practice with Expresso Framework: Using a framework to create a web application

DBMaint A Step-by-Step Example

 

 

动态魔法:C#中Dynamic Expresso的5大秘籍揭秘? 首先,让我们来认识一下Dynamic Expresso。Dynamic Expresso是一个轻量级的动态表达式求值器,它允许我们在C#中动态地编译和执行代码。这就像是给了我们一个在代码中实现“即兴创作”的机会。 阅读详情

相关推荐

Expresso正则表达式调试工具的使用与教程

Expresso是一款功能强大的正则表达式开发和测试工具,专为需要频繁编写和调试正则表达式的开发者设计。它提供了直观的用户界面,让用户可以轻松创建、修改和测试正则表达式。Expresso的高级功能,如实时调试、图形化匹配以及多语言代码片段生成,极大地提高了开发效率。Expresso的实时调试功能是其吸引广大开发者的主要原因之一。用户可以通过简洁直观的界面设计,高效地进行正则表达式的编写、测试、调试和优化。调试界面主要包含几个核心部分:表达式输入框。

weixin_42355400的博客 1043

使用Expresso学习.net正则表达式

什么是RE?想必各位大大在做文件查找的时侯都有使用过万用字符”*”,比如说想查找在Windows目录下所有的Word文件时,你可能就会用”*.doc”这样的方式来做查找,因为”*”所代表的是任意的字符。RE所做的就是类似这样的功能,但其功能更为强大。 写程序时,常需要比对字符串是否符合特定样式,RE最主要的功能就是来描述这特定的样式,因此可以将RE视为特定样式的描述式,举个例子来说,”\w+”所...

weixin_30563319的博客 345

全面体验正则表达式开发利器Expresso 3.0

搜索模式:允许用户编写和测试正则表达式,支持快速测试和多行文本搜索。替换模式:提供查找和替换功能,支持使用正则表达式作为查找模式。测试面板:为用户提供一个实时测试正则表达式的环境,显示匹配结果和相关统计信息。表达式库:Expresso包含一个内置的正则表达式库,便于用户查找和使用常用的表达式模式。帮助文档:包含了对正则表达式语法和使用方法的详细说明,便于用户学习和参考。

weixin_33506815的博客 1146

Expresso控制器的深入使用研究

Expresso控制器的深入使用研究  修订历史记录日期版本说明作者2005-08-151.0初建唐家平           1     前言... 12     控制器的输入... 23     控制器的输出对象... 33.1        Input 33.1.1    Input常用表达用标签... 43.2        Output 43.2.1    Output常用表达用标签...

rog的专栏 1277

Expresso工具汉化破解版

Expresso 正则表达式 ps:有提示,中文版本

优秀的正则表达式开发工具(含注册码)

[Expresso 3.0] The premier regular expression development tool http://www.ultrapico.com/Expresso.htm

推荐一款强大的API测试工具:Expresso

推荐一款强大的API测试工具:Expresso 如果你是一位开发者或者测试人员,并且经常需要对API进行测试,那么今天我要向你推荐一个非常实用的工具——。 Expresso是什么? Expresso是一款开源的API测试工具,它可以帮助你快速地创建、组织和运行API测试用例。它的目标是提供一种简单、直观的方式来验证你的API是否按照预期工作,并且能够方便地与其他开发者或团队共享你的测试结果。 Ex...

gitblog_00005的博客 528

Expresso.rar

正则表达式测试,用于测试自己写的表达式是否正确,大大提高开发效率

Expresso 使用指南

Expresso 使用指南 项目介绍 Expresso 是一个基于 Node.js 的轻量级 Web 应用框架,由贡献者 mikpanko 开发并维护。它旨在提供简单而灵活的方式构建高效、可扩展的网络应用程序。通过利用中间件系统,Expresso 支持路由控制、静态文件服务、模板引擎集成等核心功能,使得开发 RESTful API 和网页应用变得轻松快捷。 项目快速启动 要快速开始使用 Expre...

gitblog_00033的博客 1112

正则表达式测试分析工具 Expresso

这个测试分析工具跟一般的不一样, 它比其他工具强的地方在于 除了有一个方便的调试环境之外,还有表达式分析器,初学者就不用头昏了。 win7也可以用,需要.net framework

当windows安装git时出现以下错误提示

Windows安装Git时出现多个系统配置设置失败错误(exit code 4294967295),提示包括无法设置textconv、LFS过滤器和SSL等配置项。关键问题在于scalar.exe版本不兼容,系统提示"该版本的scalar.exe与你运行的Windows版本不兼容"。解决方案是检查程序版本是否正确,下载与Windows系统兼容的正确版本重新安装即可。

沧澜的博客 1875

Expresso 开源项目使用教程

Expresso 开源项目使用教程 1. 项目的目录结构及介绍 Expresso 项目的目录结构如下: expresso/ ├── README.md ├── LICENSE ├── package.json ├── src/ │ ├── index.js │ ├── config/ │ │ ├── default.json │ │ ├── production.json ...

gitblog_00890的博客 420

BIM Revit教程(六)尝试安装 Revit 时显示“Autodesk Revit 已安装。”

在安装Revit或RevitLT时,若系统提示“AutodeskRevit版本已安装”,通常是由于旧版本残留文件未完全清除所致。解决方案包括:1.通过控制面板或Windows设置卸载旧版本Revit,确保所有相关组件被移除;2.使用Autodesk卸载工具(AdskUninstallHelper)进一步清理;3.谨慎操作注册表,删除与Revit相关的残留项;4.确保系统有至少30GB的可用磁盘空间;5.完成上述步骤后,重新尝试安装Revit。此外,文章还提到了一个免费功能商店,供用户寻找提效工具,并鼓励粉丝

ZOZO_888的博客 2129

php 正则表达式 单行模式,正则表达式的多行模式与单行模式

测试“多行模式”测试一注意:这里样例文本中3eeeee后面没有回车,光标就在e的后面。匹配的结果是3eeeee,如上图的Search Results区中所示。为什么这里不能匹配1abcde和2abc?开启多行模式^ 可以匹配字符串开头(字符串的开始位置),也可以匹配行的开头(即换行符\n之后的位置) $ 可以匹配字符串结尾(字符串的结束位置),也可以匹配行的结尾(即换行符\n之前的位置)关闭多行模...

weixin_30768925的博客 280

python 识别滑块验证码

博客来源于: https://www.cnblogs.com/wyh0923/p/16528354.html # -*- coding: utf-8 -*- # https://gov.pkulaw.cn/ 1. import io 2. import json 3. from pathlib import Path 4. from PIL import Image 5. import bas...

2102

Gromacs GPU加速版安装全攻略:从依赖配置到性能优化

本文提供了Gromacs GPU加速版的完整安装与性能优化指南。详细介绍了从编译器、OpenMPI、FFTW到CUDA等关键依赖的配置,手把手指导编译支持CUDA的Gromacs,并深入解析了如何通过调整.mdp参数及平衡MPI与OpenMP线程分配,最大化GPU利用率,从而让分子动力学模拟效率获得数十倍提升。

y9z0a1b的博客 1151

Expresso持久层的深入使用研究

Expresso持久层的深入使用研究 修订历史记录日期版本说明作者2005-08-021.0初建唐家平          1     前言... 22     连接池的配置    23     直接使用连接池... 43.1             运行自定义SQL语句    43.2             事务处理    44     使用DBObject 54.1             创

rog的专栏 1480

小红书图文笔记图像批量爬取:Python爬虫实战与反反爬策略全解析

在当今社交媒体盛行的时代,小红书作为中国领先的生活方式分享平台,积累了海量的优质图文内容。对于数据分析师、市场研究人员或内容创作者来说,能够高效获取这些数据具有重要意义。本文将详细介绍如何使用Python构建一个高效、稳定的小红书图文笔记图像批量爬取工具,涵盖最新技术栈和反反爬策略。本文详细介绍了如何使用Python构建一个高效、稳定的小红书图文笔记图像批量爬取系统。通过结合Playwright、aiohttp等现代工具,实现了从列表页采集到图片下载的完整流程。

2201_76125261的博客 2364

Expresso表示层的深入使用研究

Expresso表示层的深入使用研究  修订历史记录日期版本说明作者2005-08-191.0初建唐家平2005-08-26 1.1修改部分内容唐家平       1     前言... 22     Struts tag和Extended Struts tag思想... 23     Expresso Extended Struts Tags  23.1             读取Output

rog的专栏 1058

[Unity开发] [PICO]避坑指南:PICO商店上传APP时PXR Platform APPID设定详解

PICO开发者上传Unity应用时常见的"APPID不符"问题,主要源于混淆了开发者后台两个不同位置的APPID。

每日出拳老爷子的博客 556

【三维激光扫描】第二章:国内外三维激光扫描设备简介

地面三维激光扫描仪是地面激光扫描系统中最主要的硬件设备,近年来得到了快速发展,主要体现在品牌数量、性能指标、类型等方面的变化。本章主要介绍国内外主要设备的基本情况,对国内外研究现状进行分析,最后指出目前存在的问题与未来的发展趋势。 2.1 国外地面三维激光扫描仪简介 目前,生产地面三维激光扫描仪的公司比较多,随着地面三维激光扫描技术应用普及程度的不断提高,国外产品在中国的市场目前还占主导地位。它们各自的产品在性能指标上有所不同,以下简要介绍有代表性的公司产品。 2.1.1 奥地利 Riegl公司的.

智慧空间实验室 4642

关于“让我们基于Node.js创建一个Web应用:记事本(二)”

我前面已经说过这是DaliayJS博客发布的一个Node.js的系列教程,是2010年开始陆续发出来的,其中有很多内容或者使用的技术组件API已经过时,我会按照我自己的理解在“关于”的系列中做一些更新,并且谈一下自己的切身体会。 其实第二部分没什么特别需要说的,大家只要按照原帖的内容做就可以了,唯有一点需要特殊说明的就是,我是在Windows平台上按照原帖的步骤逐一完成的联系,在安装的过程可能与...

weixin_30882895的博客 147

Qt实现YOLO目标检测及其界面制作(附完整源码)

Qt实现YOLO目标检测及其界面制作(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2739

Expresso 项目常见问题解决方案

Expresso 项目常见问题解决方案 1. 项目基础介绍 Expresso 是一个开源项目,旨在分析和比较英文文本的风格。该项目使用 Python 编写的程序,特别是 Python Natural Language Toolkit (NLTK) 包,来计算与写作风格相关的度量。Expresso 适合那些希望改进文本风格、保持一致性或比较不同作者风格的应用场景。 主要编程语言 Python Ja...

gitblog_00685的博客 687

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Dynamic Expresso:C动态表达式解析器的终极指南

在当今快速发展的软件开发领域,**C#动态表达式解析**已经成为构建灵活、可配置应用程序的关键技术。你是否曾经遇到过需要在运行时动态执行用户输入的数学公式、业务规则或数据过滤条件的情况?传统的硬编码方式缺乏灵活性,而完全重写代码又过于繁琐。这就是Dynamic Expresso发挥作用的地方——一个轻量级、高性能的C#表达式解释器,让你能够在运行时编译和执行基于C#语法的字符串表达式。 Dyna

gitblog_00618的博客 338

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

认识Expresso——正则编写、测试、分析利器

近期一小项目需要对PDF进行解析,方案就是将其转换成txt,然后....正则——解析字符串的首先。 对于正则业余爱好的ME,从每页具有0.5k的txt,解析出大约90个字段(样本如,用户:jinglecat), 显然是一项挑战,而且我深知,绝对是一项苦力活。 同事开源鸡说,小样新来的就是新来,Expresso 你都不知道,亏你糟蹋了公司那么多coffe? Expresso 最初是正则表...

weixin_30528371的博客 152

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

下一篇: Expresso持久层的深入使用研究
rog
rog
博客等级 码龄26年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值